Tengo la siguiente consulta SQL:
SELECT cat, CASE WHEN CCR.id_invoice_type = 52 THEN CCR.amount END earn, CASE WHEN CCR.id_invoice_type = 54 THEN CCR.amount END expend, FROM fac_invoices CCR GROUP BY CCR.cat, CCR.id_invoice_type , CCR.amount ORDER BY CCR.catcon el siguiente resultado:
cat earn expend ======================= 3 50,4 (null) 3 (null) (null) 3 (null) 35 5 160,7 (null) 5 (null) (null) 5 (null) 35 10 50,4 (null) 10 (null) (null) 10 (null) 35Pero quiero obtener el resultado actual
cat earn expend ======================= 3 50,4 35 5 160,7 35 10 50,4 35Como puede ver, he intentado agrupar los campos pero no funciona. ¿Qué hay de malo en mi consulta? ¿O qué otras funciones debo usar para obtener el resultado deseado?
Gracias por adelantado.
Necesita simplificar el GROUP BY . Solo desea una fila por cat , por lo que debería ser la única clave en GROUP BY . Una forma de hacer lo que quieres es string_agg() :
SELECT cat, STRING_AGG(CASE WHEN CCR.id_invoice_type = 52 THEN CCR.amount END) as earn, STRING_AGG(CASE WHEN CCR.id_invoice_type = 54 THEN CCR.amount END) as expend FROM fac_invoices CCR GROUP BY CCR.cat ORDER BY CCR.cat; O MAX() también funciona en su caso.
SELECT cat, MAX(CASE WHEN CCR.id_invoice_type = 52 THEN CCR.amount END) as earn, MAX(CASE WHEN CCR.id_invoice_type = 54 THEN CCR.amount END) as expend FROM fac_invoices CCR GROUP BY CCR.cat ORDER BY CCR.cat;Deberías usar string_agg() y luego como
CASE WHEN CCR.id_invoice_type = 52 THEN string_agg(CCR.amount,',') END earn,