PSQL Group по нескольким условиям в одной строке - PullRequest
1 голос
/ 04 июня 2019

Допустим, у меня есть таблица, подобная этой:

Letter  Color  
A       Red    
A       Blue    
B       Red          
C       Red
C       Red

Я хотел бы получить следующий формат вывода:

Letter   Red   Blue
A        1     1
B        1     0
C        2     0

Пробовал ниже:

SELECT letter, red, blue FROM (
SELECT letter, count(*) AS red from letters where color = 'red'
GROUP BY letter
UNION
SELECT letter, count(*) AS blue from letters where color = 'blue'
GROUP BY letter
) GROUP BY letter

Может кто-нибудь помочь?Пожалуйста, обратите внимание, что я не могу добавить какой-либо табличный или аналогичный БД.Заранее спасибо

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Я думаю, что самый простой метод - условная агрегация:

select letter,
       sum(case when color = 'Red' then 1 else 0 end) as red,
       sum(case when color = 'Blue' then 1 else 0 end) as blue
from letters
group by letter
order by letter;
0 голосов
/ 04 июня 2019

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

select T1.Letter, CASE WHEN Red is NULL THEN 0 ELSE Red END AS Red , CASE WHEN Blue is NULL THEN 0 ELSE Blue END AS Blue   
from 
(select Letter, count(*) as Red from letters where Color = 'Red' group by Letter) T1 
full join 
(select Letter, count(*) as Blue from letters where Color = 'Blue' group by Letter) T2 
on T1.Letter = T2.Letter;
0 голосов
/ 04 июня 2019

Вы можете UNION с SELECT в виде красного, синего значений и получить MAX() значения красного, синего GROUP BY letter

SELECT letter, MAX(red) AS red, MAX(blue) AS blue 
FROM (
    SELECT letter, count(*) AS red, 0 AS blue 
    FROM letters 
    WHERE color = 'red'
    GROUP BY letter
    UNION
    SELECT letter, 0 AS red, count(*) AS blue 
    FROM letters 
    WHERE color = 'blue'
    GROUP BY letter
) alias_name 
GROUP BY letter
...