我有这个查询:
SELECT
SUM(CASE WHEN color = 'blue' THEN 1 ELSE 0 END) AS "Blue",
SUM(CASE WHEN color = 'purple' THEN 1 ELSE 0 END) AS "Purple",
SUM(CASE WHEN color = 'yellow' THEN 1 ELSE 0 END) AS "Yellow",
SUM(CASE WHEN color= 'blue' THEN 1 WHEN color= 'yellow' THEN -1 END) AS "Mixed"
FROM table;
结果显示出一个有4列1行的表:
例如蓝色|紫色|黄色|混合
但是我希望结果显示在4行1列中,如下所示:
蓝色
有人知道在这种情况下我能做什么吗?我一直在为此工作。
这有点令人痛苦,因为混合值-简单的聚合是不够的。因此,请使用侧向联接取消枢纽:
SELECT v.*
FROM (SELECT SUM(CASE WHEN color = 'blue' THEN 1 ELSE 0 END) AS Blue,
SUM(CASE WHEN color = 'purple' THEN 1 ELSE 0 END) AS Purple,
SUM(CASE WHEN color = 'yellow' THEN 1 ELSE 0 END) AS Yellow,
SUM(CASE WHEN color = 'blue' THEN 1 WHEN color = 'yellow' THEN -1 END) AS Mixed
FROM t
) t CROSS JOIN LATERAL
(VALUES ('Blue', blue), ('Purple', purple), ('Yellow', yellow), ('Mixed', mixed)
) v(which, val);
实际上,在Postgres中,您也可以这样写:
SELECT v.*
FROM (SELECT COUNT(*) FILTER (WHERE color = 'blue') AS Blue,
COUNT(*) FILTER (WHERE color = 'purple') AS Purple,
COUNT(*) FILTER (WHERE color = 'yellow') AS Yellow
FROM t
) t CROSS JOIN LATERAL
(VALUES ('Blue', blue), ('Purple', purple), ('Yellow', yellow), ('Mixed', blue - yellow)
) v(which, val)
对于前三个计数器,您可以group by color
进行汇总并将UNION ALL
用于Mixed
:
SELECT color, COUNT(*) counter
WHERE color IN ('blue', 'purple', 'yellow') -- remove this line if these are all the possible colors
FROM table
GROUP BY color
UNION ALL
SELECT 'Mixed', SUM(CASE WHEN color = 'blue' THEN 1 WHEN color = 'yellow' THEN -1 END)
WHERE color IN ('blue', 'yellow')
FROM table
此查询将返回2列。如果您不希望第一栏,那么:
SELECT COUNT(*) counter
WHERE color IN ('blue', 'purple', 'yellow') -- remove this line if these are all the possible colors
FROM table
GROUP BY color
UNION ALL
SELECT SUM(CASE WHEN color = 'blue' THEN 1 WHEN color = 'yellow' THEN -1 END)
FROM table
WHERE color IN ('blue', 'yellow')