按语义统计和分组:为什么这两个不同?

时间:2015-02-25 08:24:24

标签: sql

所以我对SQL很陌生并且有以下两个问题:

WITH contributions AS (
  SELECT cc.cand_id, cc.cmte_id
    FROM committee_contributions as cc
    GROUP BY cc.cand_id, cc.cmte_id
)
SELECT c.cand_id, COUNT(c.cand_id) as count
  FROM contributions as c
  GROUP BY c.cand_id 
  ORDER BY count DESC

SELECT cc.cand_id, count(cc.cmte_id) as count
  FROM committee_contributions as cc
  GROUP BY cc.cand_id
  ORDER BY count DESC

这给了我两个完全不同的输出。根据我的理解,第一个选择两列并通过cand_id然后cmte_id对它们进行分组,然后计算每个cand_id的出现次数。第二个计算与每个cand_id相关联的cmte_id的数量。在我看来,第二个应该与第一个相同。任何人都可以告诉我这个区别吗?

另外,有没有更好的方法来编写第一个语句而不使用WITH或嵌套查询?

2 个答案:

答案 0 :(得分:0)

第一个查询是计算每个cand_id的cmte_id出现的不同次数(包括空值,如果有的话),第二个是计算每个cand_id的记录总数,其中cmte_id不为null

答案 1 :(得分:0)

NO。它们是两个非常不同的东西。在第一个中,您计算​​的是cand_id,而在第二个中,cmte_id

此外,在第一个查询中,汇总(分组)发生两次。因此,每cand_id的计数将小于第二个计数。

您可以使用下面的查询替换您的第一个查询,其基本相同:

SELECT cand_id, cmte_id, COUNT(DISTINCT cand_id) as [count]
FROM contributions
GROUP BY cand_id, cmte_id 
ORDER BY [count] DESC

但是,如果您严格不需要cmte_id列,则需要使用嵌套查询。