es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta PostgreSQL para obtener la suma y las columnas de dos tablas utilizando uniones.

Estas son las tablas que he creado: Tablas

  1. Quiero obtener accounts.account, accounts.type, DATE(transactions.date), transactions.transactionid, transactions.amount, transactions.note de dos tablas entre ’10-11-2021′ y ’31-12-2021′ (cualquier tipo).

  2. Quiero obtener la suma de account de la tabla transactions donde type=”income” y entre ’10-11-2021′ y ’31-12-2021′.

  3. Quiero obtener la suma de account de la tabla transactions donde type=”expense” y entre ’10-11-2021′ y ’31-12-2021′.

Pero necesito las tres consultas en una sola instrucción (eso es lo que me está costando).

Mi consulta:

SELECT accounts.account, accounts.type, DATE(transactions.date), transactions.transactionid, transactions.amount, transactions.note
FROM transactions
FULL JOIN accounts ON transactions.accountid = accounts.accountid
WHERE transactions.date BETWEEN '10-11-2021' AND '31-12-2021' ORDER BY transactions.date

UNION

SELECT SUM(amount)
FROM transactions
FULL JOIN accounts ON transactions.accountid = accounts.accountid
WHERE accounts.type = 'income'

-- Agregar las otras dos consultas aquí

¿Alguien puede ayudarme?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Aquí tienes una consulta actualizada que combina las tres consultas en una sola:

    SELECT  accounts.account, accounts.type, DATE(transactions.date), 
            transactions.transactionid, transactions.amount, transactions.note,
            SUM(CASE WHEN accounts.type = 'income' THEN transactions.amount ELSE 0 END) AS income_sum,
            SUM(CASE WHEN accounts.type = 'expense' THEN transactions.amount ELSE 0 END) AS expense_sum
    FROM transactions
    JOIN accounts ON transactions.accountid = accounts.accountid
    WHERE transactions.date BETWEEN '10-11-2021' AND '31-12-2021'
    GROUP BY accounts.account, accounts.type, DATE(transactions.date), transactions.transactionid, transactions.amount, transactions.note
    ORDER BY transactions.date
    

    Explicación:

    • Utilizamos una declaración CASE dentro de la función SUM para calcular las sumas de ingresos y gastos por separado, en función de la columna accounts.type.
    • Utilizamos una cláusula GROUP BY para agrupar el conjunto de resultados por todas las columnas que estamos seleccionando, de modo que podamos usar la función SUM y mantener las otras columnas en la salida.
    • Ordenamos el conjunto de resultados por la columna transactions.date, al igual que en la consulta original.

    Ten en cuenta que en las consultas originales, la tabla accounts nunca se utilizó para filtrar filas, solo para unirse con la tabla transactions. Por lo tanto, no es necesario usar una unión FULL, y se podría utilizar una unión INNER en su lugar (lo cual sería más eficiente si hay muchas filas con ID de cuenta faltante).

Comments are closed.