我需要一个Postgresql查询,它返回每种记录组合的计数。
例如,我有一个表T,其中包含A,B,C,D,E列以及其他不重要的列:
Table T -------------- A | B | C | D | E
查询应该返回一个表R,其中包含A,B,C,D列的值,以及每个配置在指定E值下出现的次数。
Table R --------------- A | B | C | D | count
当每个记录的所有计数加在一起时,它应该等于原始表中的记录总数。
这似乎是一个非常简单的问题,但由于我缺乏SQL知识,我无法弄清楚如何做到这一点。
我能想到的唯一解决方案是:
select a, b, c, d, count(*)
from T
where e = 'abc'
group by a, b, c, d
但是当从这个查询中添加计数时,它远远超过原始表的计数。似乎不应该使用count(*),或者我只是完全以错误的方式处理这个问题。我真的很感激我应该如何解决这个问题。谢谢大家。
答案 0 :(得分:0)
NULL
值不可能欺骗你。考虑一下这个演示:
WITH t(a,b,c,d) AS (
VALUES
(1,2,3,4)
,(1,2,3,NULL)
,(2,2,3,NULL)
,(2,2,3,NULL)
,(2,2,3,4)
,(2,NULL,NULL,NULL)
,(NULL,NULL,NULL,NULL)
)
SELECT a, b, c, d, count(*)
FROM t
GROUP BY a, b, c, d
ORDER BY a, b, c, d;
a | b | c | d | count
---+---+---+---+-------
1 | 2 | 3 | 4 | 1
1 | 2 | 3 | | 1
2 | 2 | 3 | 4 | 1
2 | 2 | 3 | | 2
2 | | | | 1
| | | | 1
这里肯定会有其他一些误解。
答案 1 :(得分:0)
我明白了,这真的很愚蠢。在比较计数时,我忘了在选择计数(*)中指定'E'='ABC'子句的位置。无论如何,谢谢你的帮助!