MySQL:统计表中X、Y字段值对的出现频次问题
解决(X,Y)值对频次统计的SQL问题
嘿,我来帮你排查这个问题~首先咱们先明确你的需求:统计表中每个唯一(X,Y)组合的出现次数,对吧?
先看你的原始数据:
| ID | X | Y |
|---|---|---|
| 1 | 10 | 20 |
| 2 | 20 | 10 |
| 3 | 10 | 20 |
| 4 | 30 | 20 |
| 5 | 20 | 10 |
| 6 | 20 | 10 |
你写的SQL问题出在COUNT(DISTINCT X, Y)这里:
SELECT X, Y, COUNT(DISTINCT X, Y) AS FREQUENCY FROM `ordini` GROUP BY X, Y ORDER BY `FREQUENCY` DESC
为什么不对呢?因为当你用GROUP BY X,Y的时候,每个分组里的所有行都是完全相同的(X,Y)组合,这时候COUNT(DISTINCT X,Y)会对每个分组里的X,Y去重,结果自然是1——每个分组里只有一种(X,Y)组合呀!这显然不是你要的频次。
正确的SQL写法
你只需要把COUNT(DISTINCT X, Y)改成COUNT(*)(或者COUNT(1)、COUNT(ID)都可以,因为ID是唯一的),这样就能统计每个分组里的行数,也就是该(X,Y)组合的出现次数:
SELECT X, Y, COUNT(*) AS FREQUENCY FROM `ordini` GROUP BY X, Y ORDER BY `FREQUENCY` DESC
执行这个语句后,就能得到你期望的结果:
| X | Y | FREQUENCY |
|---|---|---|
| 20 | 10 | 3 |
| 10 | 20 | 2 |
| 30 | 20 | 1 |
简单来说,GROUP BY X,Y已经帮你把相同的(X,Y)组合归为一组了,你只需要统计每组里有多少行就行,不需要再对X,Y去重统计啦~
内容的提问来源于stack exchange,提问作者kiks73
相关产品推荐
相关产品推荐

