GROUP BY с суммой без удаления пустых (нулевых) значений - PullRequest
0 голосов
/ 27 апреля 2018

ТАБЛИЦА:

Игроки

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, поскольку он ведет себя так же.

Ответы [ 5 ]

0 голосов
/ 27 апреля 2018

Пожалуйста, попробуйте это:

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

Надеюсь, это поможет.

0 голосов
/ 27 апреля 2018

Я просто предлагаю это, чтобы у вас был правильный ответ:

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.

0 голосов
/ 27 апреля 2018

Измените JOIN на LEFT JOIN, затем добавьте IFNULL (значение 0) в SUM ()

0 голосов
/ 27 апреля 2018

левое объединение сохраняет все строки в левой таблице

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

0 голосов
/ 27 апреля 2018

с использованием 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
...