PSQL 在同一行上按多个条件分组

PSQL Group by multiple conditions on same row

假设我有这样一个 table:

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

有人可以帮忙吗?请注意,我不能添加任何 tablefunc 或类似的数据库。 提前致谢

您可以 UNIONSELECT 作为红色、蓝色值并获得红色、蓝色的 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

您可以尝试在 Letter 上分组,单独获取计数然后加入

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;

我认为最简单的方法是条件聚合:

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;