我有两个查询如下所示。
查询1
SELECT a.utype, DATE_TRUNC(b.date, DAY) AS date, (b.noofspec)
FROM `table1`as a
JOIN `table2` as b
ON a.joinkey = b.joinkey
GROUP BY 1, 2, 3
ORDER BY 2;
查询2
SELECT a.utype, DATE_TRUNC(b.date, DAY) AS date, SUM(b.noofspec)
FROM `table1`as a
JOIN `table2` as b
ON a.joinkey = b.joinkey
GROUP BY 1, 2
ORDER BY 2;
我预计QUERY 1的(b.noofspec(会有一个与SUM((b.noofspec((值相同的TOTAL。然而,它返回了一个完全不同的值。
我的桌子看起来像这个
表B
gameid | 日期 | noofspecsid | |
---|---|---|---|
1 | 2121-04-06 00:01 | 50 | ID1 |
2 | 2121-04-06 00:01 | 50 | ID2 |
3 | 2121-04-06 00:01 | 58 | ID3 |
4 | 2121-04-06 00:01 | 100 | ID4 |
5 | 2121-04-06 00:01 | 555 | ID5 |
6 | 2121-04-06 00:01 | 55 | ID6 |
7 | 2121-04-06 00:01 | <17>ID7 |
您的两个查询非常不同;第一个查询将返回一组不同的值,第二个查询将求和一组不不同的
让我们用更简单的数据来演示:
A.X, A.Y
1, 100
2, 200
B.X
1
1
1
2
2
让我们加入表格:
SELECT A.X, A.Y, B.X
FROM A JOIN B ON A.X = B.X
结果:
1, 100, 1
1, 100, 1
1, 100, 1
2, 200, 2
2, 200, 2
前两列来自A,第三列来自B
加入B导致A的行重复。即使你没有选择B,它们仍然会重复;重复是由加入引起的
这一切都很好,直到你想总结Y
SELECT A.X, SUM(A.Y) FROM A JOIN B ON A.X = B.X GROUP BY A.X
1, 300
2, 400
重复包含在总和中
那么,为什么它与您的第一个查询不同呢?
您的第一个查询将所有列分组,有效地压缩了生成的重复
SELECT A.X, A.Y, B.X
FROM A JOIN B ON A.X = B.X
GROUP BY A.X, A.Y, B.X
上面的select和from行是我第一次在这个答案中写的原始查询;它们生成5行、3行1100.1和2行2200,2
该组通过将它们压缩回只有唯一的行,因此Y的总和将非常不同,因为在总和中没有重复的值