Tengo el siguiente código:

SELECT gl.account_description AS invoice_total, COUNT(ili.invoice_id) AS total_invoice, 
    SUM(ili.line_item_amount) AS total_convert
FROM general_ledger_accounts gl JOIN
     invoice_line_items ili 
     ON gl.account_number = ili.account_number JOIN
     invoices i
     ON ili.invoice_id = i.invoice_id
GROUP BY gl.account_description, i.invoice_date, ili.account_number
HAVING i.invoice_date BETWEEN '2014-04-01' AND '2014-06-30' AND
      COUNT(ili.account_number) > 1
ORDER BY account_description DESC;

En mi consulta, se supone que debo devolver 10 filas de datos y solo tengo 7 devoluciones y ninguna de ellas con la información correcta. Lo que debería haber devuelto es la columna account_description de la tabla general_ledger_accounts, un recuento de los elementos en la tabla invoice_line_items, una suma de las columnas line_item_amount en la tabla invoice_line_items que tienen el mismo número de cuenta. Solo debe buscar dentro de las facturas entre las fechas '2014-04-01' y '2014-06-30'. Se supone que debo unirme a la tabla de facturas.

¿Alguien puede ver qué es lo que estoy haciendo mal en mi sintaxis para obtener los resultados incorrectos?

0
Ellie 16 feb. 2020 a las 01:22

2 respuestas

La mejor respuesta

Obviamente, desea una cláusula WHERE y no una cláusula HAVING para filtrar en las fechas, y para eliminar la fecha de GROUP BY (no la está seleccionando):

SELECT gl.account_description AS invoice_total,
       COUNT(*) AS total_invoice, 
       SUM(ili.line_item_amount) AS total_convert
FROM general_ledger_accounts gl JOIN
     invoice_line_items ili 
     ON gl.account_number = ili.account_number JOIN
     invoices i
     ON ili.invoice_id = i.invoice_id
WHERE i.invoice_date BETWEEN '2014-04-01' AND '2014-06-30'
GROUP BY gl.account_description, ili.account_number
HAVING COUNT(*) > 1
ORDER BY account_description DESC;

No sé si hay otros problemas.

0
Gordon Linoff 15 feb. 2020 a las 22:37

Sospecho que desea eliminar las columnas i.invoice_date y ili.account_number de la cláusula group by. De lo contrario, obtendrá un registro por valores distintos de estas tres columnas, que no parece ser lo que desea.

En consecuencia, debe mover el filtro en las fechas a la cláusula where:

SELECT 
    gl.account_description AS invoice_total, 
    COUNT(ili.invoice_id) AS total_invoice, 
    SUM(ili.line_item_amount) AS total_convert
FROM general_ledger_accounts gl 
INNER JOIN invoice_line_items ili 
    ON gl.account_number = ili.account_number 
INNER JOIN invoices i 
    ON ili.invoice_id = i.invoice_id
WHERE 
    i.invoice_date >= '2014-04-01' 
    AND i.invoice_date < '2014-07-01'
GROUP BY gl.account_description
HAVING COUNT(ili.account_number) > 1
ORDER BY g1.account_description DESC;

Tenga en cuenta que modifiqué la condición en las fechas para usar intervalos medio abiertos: de esta manera, no tiene que preocuparse de si el último mes tiene 30 o 31 días (o 28, o 29 ...); esto también manejaría sin problemas la parte de tiempo de las fechas, si corresponde.

0
GMB 15 feb. 2020 a las 22:26