Возвращает количество по двум критериям из одного столбца и ГРУППЫ По другому столбцу

#mysql #sql #group-by #count #pivot

#mysql #sql #группа по #количество #сводная

Вопрос:

Следующее мое table :

 | col_A | col_B |
|-------|-------|
| A     | Yes   |
| B     | No    |
| A     |       |
| A     | Yes   |
| B     |       |
| A     | No    |
| A     | Yes   |
  

Я попробовал следующее:

 SELECT 
col_A, 
(SELECT COUNT(col_B) FROM table WHERE col_B= "Yes") AS Yes_Count, 
(SELECT COUNT(col_B) FROM table WHERE col_B= "No") AS No_Count 
FROM table
GROUP BY col_A;
  

Но это возвращает неправильную таблицу:

 | GROUP_BY_colA | Yes_Count | No_Count |
|---------------|-----------|----------|
| A             | 3         | 1        |
| B             | 3         | 1        |
  

Мой требуемый вывод:

 | GROUP_BY_colA | colA_count | Yes_Count | No_Count |
|---------------|------------|-----------|----------|
| A             | 5          | 3         | 1        |
| B             | 2          |           | 1        |
  

Ответ №1:

Рассмотрите возможность использования условной агрегации для поворота вашего набора данных. В MySQL вы можете сформулировать это как:

 select
    col_a,
    count(*) col_a_count,
    sum(col_b = 'Yes') yes_count,
    sum(col_b = 'No') no_count
from mytable
group by col_a
  

Ответ №2:

Использовать conditional aggregation

 SELECT col_A, 
count(*) as colA_count,
count(case when col_B= 'Yes' then 1 end) AS Yes_Count,
count(case when col_B= 'No' then 1 end) AS No_Count
FROM table
GROUP BY col_A
  

Комментарии:

1. Лишняя запятая в 4-й строке.

Ответ №3:

Вы можете использовать оператор Case:

 SELECT 
col_A, count(*) as colA_count,
count(case when col_B= 'Yes' then col_B end) AS Yes_Count,
count(case when col_B= 'No' then col_B end) AS No_Count
FROM Table_count
GROUP BY col_A;
  

Ответ №4:

 select tab1.col_a,tab1.colA_count,tab2.Yes_count,tab3.No_count from (
select col_A, count(*) as colA_count from st group by Col_A)as tab1 inner join
(select col_A, count(*) as Yes_count from st where col_B='Yes' group by Col_A) as tab2 on tab1.col_A=tab2.col_A inner join
(select col_A, count(*) as No_count from st where col_B='No' group by Col_A) as tab3 on tab3.col_A=tab2.col_A;