Hay una tabla de "pagos"

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

Necesita la suma de efectivo.

No entiendo por qué esta consulta da resultados incorrectos:

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 
0
Елисей Горьков 9 sep. 2018 a las 17:13

3 respuestas

La mejor respuesta

Debe agregar la columna sale_type a la instrucción GROUP BY para la consulta interna y debe ser group by user_id, sale_type para obtener los resultados correctos para su estilo de consulta.

PD en realidad, no creo que necesites una subconsulta.

La consulta anterior da el resultado como 60, mientras que

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;

O

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

Da 40 para la columna resultante cash

Demostración de violín de SQL

1
Barbaros Özhan 9 sep. 2018 a las 14:39

Creo que es posible que no necesite el distinct en su subconsulta o la subconsulta completa.

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

O sin 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
Jingyi Su 9 sep. 2018 a las 15:40

¿Por qué no usas la cláusula 'Tener' que está hecha para este propósito?

SELECT SUM(amount) AS cash FROM payments
WHERE payment_time = '2018-04-01'
GROUP BY sale_type
HAVING sale_type= 'cash'
1
kamran pervez 9 sep. 2018 a las 15:02