Saltar al contenido

¿Cómo agregar una fila ‘total’ en una consulta agrupada (en Postgresql)?

Después de mucho batallar pudimos dar con la respuesta de este conflicto que ciertos usuarios de nuestro sitio web tienen. Si quieres compartir algún detalle no dejes de compartir tu conocimiento.

Solución:

Puede lograr esto usando una consulta UNION. En la consulta a continuación, agrego una columna de ordenación artificial y envuelvo la consulta de unión en una consulta externa para que la línea de suma aparezca en la parte inferior.

[I’m assuming you’ll be adding your joins and group by clauses…]

SELECT section, money, requests FROM  -- outer select, to get the sorting right.

(    SELECT 
        organizations.name || ' - ' || section.name as Section, 
        SUM(requests.money) as money, 
        COUNT(*) as requests,
        0 AS sortorder -- added a sortorder column
     FROM 
        schema.organizations
    INNER JOINs omitted --
    WHERE 
        -- omitted --
    GROUP BY 
        -- omitted --
       --  ORDER BY is not used here


UNION

    SELECT
       'BMO - Total' as section,
        SUM(requests.money) as money, 
        COUNT(*) as requests,
        1 AS sortorder
    FROM 
        schema.organizations
        -- add inner joins and where clauses as before
) AS unionquery

ORDER BY sortorder -- could also add other columns to sort here

La función de resumen en esta respuesta https://stackoverflow.com/a/54913166/1666637 podría ser una forma conveniente de hacer esto. Más sobre esto y funciones relacionadas aquí: https://www.postgresql.org/docs/devel/queries-table-expressions.html#QUERIES-GROUPING-SETS

Algo como esto, código no probado

WITH w as (
    --SELECT statement from above--
)
SELECT * FROM w ROLLUP((money,requests))

Tenga en cuenta los paréntesis dobles, son significativos

Eres capaz de sostener nuestra faena exponiendo un comentario y dejando una puntuación te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *