3

表格:

球员

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,因为它的行为方式相同。

4

5 回答 5

8

使用LEFT JOINcoalesce功能

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
于 2018-04-27T14:11:20.473 回答
2

将您的 JOIN 更改为 LEFT JOIN,然后在您的 SUM() 中添加 IFNULL(value, 0)

于 2018-04-27T14:12:04.703 回答
2

左连接保留左表中的所有行

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(*)

于 2018-04-27T14:14:19.400 回答
1

我只是提供这个,所以你有一个正确的答案:

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.

于 2018-04-27T14:33:20.857 回答
1

请试试这个:

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

希望这可以帮助。

于 2018-04-27T15:12:01.640 回答