SQLite: выбор нескольких счетчиков из одного столбца - PullRequest
0 голосов
/ 09 января 2020

Я выполняю запрос с SQLite и относительно новичок в этом. Взгляд моего набора данных:

  ColA       ColB 
 Atlanta     mild
 Atlanta    moderate
 Miami       high
 Houston    moderate
 Houston    moderate
 Miami       mild
 Atlanta    moderate

Я хочу сгруппировать результаты по полковнику А, а затем показать еще 3 столбца (мягкий, умеренный, высокий) и их количество - вот что я ищу:

 ColA    mild    moderate    high
Atlanta   1        2          0
Houston   0        2          0
Miami     1        0          1

Я знаю, как выбрать один из столбцов (скажем, мягкий), но не знаю, как выбрать другие. Спасибо!

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вы можете поворачиваться с условным агрегированием:

select 
    colA,
    sum(case when ColB = 'mild' then 1 else 0 end) mild,
    sum(case when ColB = 'moderate' then 1 else 0 end) moderate,
    sum(case when ColB = 'high' then 1 else 0 end) high
from mytable
group by colA

Демонстрация на DB Fiddle :

ColA    | mild | moderate | high
:------ | :--- | :------- | :---
Atlanta | 1    | 2        | 0   
Houston | 0    | 2        | 0   
Miami   | 1    | 0        | 1   
0 голосов
/ 10 января 2020

Sqlite 3.30 добавлена ​​поддержка предложений FILTER для агрегатных функций. Я думаю, что когда это возможно, это делает запрос чище и проще для понимания, чем CASE, который вы должны использовать в более старых версиях (в частности, вы можете использовать count() вместо sum(), что лучше передает то, что вы на самом деле пытаетесь для расчета).

SELECT ColA
     , count(ColB) FILTER (WHERE ColB = 'mild') AS Mild
     , count(ColB) FILTER (WHERE ColB = 'moderate') AS Moderate
     , count(ColB) FILTER (WHERE ColB = 'high') AS High
FROM cities
GROUP BY ColA
ORDER BY ColA;
ColA        Mild        Moderate    High      
----------  ----------  ----------  ----------
Atlanta     1           2           0         
Houston     0           2           0         
Miami       1           0           1    
...