我有以下数据:
countryId languageUsed
1 English
1 France
2 English
2 Spanish
3 Italian
1 Russian
当我查询时:
SELECT count(DISTINCT countryId)
FROM languages
GROUP BY countryId
我明白了:
count(DISTINCT countryId)
1
1
1
而不仅仅是3.当我删除GROUP BY
子句时,它会给我正确的结果。
有人可以解释这种行为的原因是什么。
答案 0 :(得分:1)
GROUP BY
的目的是占用几行并将它们变成一行。如果是这样,它必须知道如何处理具有不同值的所有组合行。这就是为什么你想要SELECT
的每个字段都有两个选项,可以将它包含在GROUP BY
子句中,或者在聚合函数中使用它,这样系统就知道你想要如何组合字段
您还遇到了GROUP BY
条款的严格要求。哪个不在GROUP BY
子句中的列必须应用一个函数来减少匹配"组的所有记录"单个记录,例如SUM
,MAX
,MIN
,AVG
和其他记录。
如果列出GROUP BY
子句中的所有选定列,则实质上是要求从结果集中排除重复记录。这与SELECT DISTINCT
具有相同的效果,这也消除了结果集中的重复行。
除非你非常想要同时使用它们并获得所需的结果,否则你可以使用SUM
。见下文:
SELECT SUM(countryId) FROM
(
SELECT COUNT(DISTINCT countryId)countryId
FROM languages
GROUP BY countryId
) AS A
<强> SEE DEMO HERE 强>
答案 1 :(得分:0)
如果您只想计算不同的count()
,则不应将group by
和column
用于查询中的同一countryId
。结果是这样的,因为它将返回的count(DISTINCT countryId)
分发到多个row
(因为GROUP BY countryId
子句),而不是只返回一个row
。代码count(DISTINCT countryId)
就足够了。