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 或类似的数据库。
提前致谢
您可以 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
您可以尝试在 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;
假设我有这样一个 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 或类似的数据库。 提前致谢
您可以 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
您可以尝试在 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;