GROUP BY 与 SUM 不删除空(空)值
GROUP BY with SUM without removing empty (null) values
表格:
玩家
player_no | transaction_id
----------------------------
1 | 11
2 | 22
3 | (null)
1 | 33
事务
id | value |
-----------------------
11 | 5
22 | 10
33 | 2
我的目标是获取所有数据,维护所有玩家,即使在以下查询中有 null
个值:
SELECT p.player_no, COUNT(p.player_no), SUM(t.value) FROM Players p
INNER JOIN Transactions t ON p.transaction_id = t.id
GROUP BY p.player_no
然而结果省略了空值,例如:
player_no | count | sum
------------------------
1 | 2 | 7
2 | 1 | 10
我想提一下空值:
player_no | count | sum
------------------------
1 | 2 | 7
2 | 1 | 10
3 | 0 | 0
我在这里想念什么?
实际上我为此使用了 QueryDSL,但是将示例翻译成纯 SQL 因为它的行为方式相同。
使用 LEFT JOIN
和 coalesce
函数
SELECT p.player_no, COUNT(p.player_no), coalesce(SUM(t.value),0)
FROM Players p
LEFT JOIN Transactions t ON p.transaction_id = t.id
GROUP BY p.player_no
将 JOIN 更改为 LEFT JOIN,然后在 SUM() 中添加 IFNULL(value, 0)
left join 保留左侧的所有行 table
SELECT p.player_no
, COUNT(*) as count
, SUM(isnull(t.value,0))
FROM Players p
LEFT JOIN Transactions t
ON p.transaction_id = t.id
GROUP BY p.player_no
您可能正在寻找 count(t.value)
而不是 count(*)
我只是提供这个,所以你有一个正确的答案:
SELECT p.player_no, COUNT(t.id) as [count], COALESCE(SUM(t.value), 0) as [sum]
FROM Players p LEFT JOIN
Transactions t
ON p.transaction_id = t.id
GROUP BY p.player_no;
你需要注意聚合函数以及JOIN
。
请试试这个:
SELECT P.player_no,
COUNT(*) as count,
SUM(isnull(T.value,0))
FROM Players P
LEFT JOIN Transactions T
ON P.transaction_id = T.id
GROUP BY P.player_no
希望对您有所帮助。
表格:
玩家
player_no | transaction_id
----------------------------
1 | 11
2 | 22
3 | (null)
1 | 33
事务
id | value |
-----------------------
11 | 5
22 | 10
33 | 2
我的目标是获取所有数据,维护所有玩家,即使在以下查询中有 null
个值:
SELECT p.player_no, COUNT(p.player_no), SUM(t.value) FROM Players p
INNER JOIN Transactions t ON p.transaction_id = t.id
GROUP BY p.player_no
然而结果省略了空值,例如:
player_no | count | sum
------------------------
1 | 2 | 7
2 | 1 | 10
我想提一下空值:
player_no | count | sum
------------------------
1 | 2 | 7
2 | 1 | 10
3 | 0 | 0
我在这里想念什么? 实际上我为此使用了 QueryDSL,但是将示例翻译成纯 SQL 因为它的行为方式相同。
使用 LEFT JOIN
和 coalesce
函数
SELECT p.player_no, COUNT(p.player_no), coalesce(SUM(t.value),0)
FROM Players p
LEFT JOIN Transactions t ON p.transaction_id = t.id
GROUP BY p.player_no
将 JOIN 更改为 LEFT JOIN,然后在 SUM() 中添加 IFNULL(value, 0)
left join 保留左侧的所有行 table
SELECT p.player_no
, COUNT(*) as count
, SUM(isnull(t.value,0))
FROM Players p
LEFT JOIN Transactions t
ON p.transaction_id = t.id
GROUP BY p.player_no
您可能正在寻找 count(t.value)
而不是 count(*)
我只是提供这个,所以你有一个正确的答案:
SELECT p.player_no, COUNT(t.id) as [count], COALESCE(SUM(t.value), 0) as [sum]
FROM Players p LEFT JOIN
Transactions t
ON p.transaction_id = t.id
GROUP BY p.player_no;
你需要注意聚合函数以及JOIN
。
请试试这个:
SELECT P.player_no,
COUNT(*) as count,
SUM(isnull(T.value,0))
FROM Players P
LEFT JOIN Transactions T
ON P.transaction_id = T.id
GROUP BY P.player_no
希望对您有所帮助。