О правильном использовании суммы в выписке по делу - PullRequest
0 голосов
/ 09 сентября 2018

Есть таблица "платежей"

user_id     payment_time    amount    sale_type
1            2018-04-01      10       cash
1            2018-04-01      10       cash
1            2018-04-01      10       cash
1            2018-04-01      20       bank
2            2018-04-01      10       cash
2            2018-04-01      10       cash

Нужна сумма денег.

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

select SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) 
as cash
FROM 
(SELECT distinct user_id, SUM(amount) AS amount, sale_type FROM payments where 
payment_time = '2018-04-01' group by user_id) p1 

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Почему бы вам не использовать предложение «Имею», которое сделано для этой цели.

SELECT SUM(amount) AS cash FROM payments
WHERE payment_time = '2018-04-01'
GROUP BY sale_type
HAVING sale_type= 'cash'
0 голосов
/ 09 сентября 2018

Я думаю, вам может не понадобиться distinct в вашем подзапросе или во всем подзапросе вообще.

select p.user_id as id, sum(case when p.sale_type = 'cash' then p.amount else 0 end) as amount
from payments p 
where p.payment_time = '2018-04-01' 
group by p.user_id

или без case

select p.user_id, sum(p.amount)
from payments p 
where p.sale_type = 'cash' and p.payment_time = '2018-04-01' 
group by p.user_id
0 голосов
/ 09 сентября 2018

Вам нужно добавить sale_type столбец к GROUP BY для внутреннего запроса, и это должно быть group by user_id, sale_type для правильных результатов для вашего стиля запроса.

P.S. на самом деле, я не думаю, что вам нужен подзапрос.

Приведенный выше запрос дает результат как 60, тогда как

select SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) as cash
  from 
 (select distinct user_id, SUM(amount) AS amount, sale_type 
    from payments 
   where payment_time = date'2018-04-01' 
   group by user_id, sale_type) p1;

или

select SUM(CASE WHEN sale_type='cash' THEN amount ELSE 0 END) as cash 
  from payments 
 where payment_time = date'2018-04-01'

дает 40 для результирующего cash столбца

Демонстрация SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...