sql查询分解每个组合的计数

时间:2012-08-06 21:32:47

标签: postgresql group-by

我需要一个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(*),或者我只是完全以错误的方式处理这个问题。我真的很感激我应该如何解决这个问题。谢谢大家。

2 个答案:

答案 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'子句的位置。无论如何,谢谢你的帮助!