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?
2 respuestas
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.
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.
Nuevas preguntas
mysql
MySQL es un sistema de gestión de bases de datos relacionales (RDBMS) gratuito y de código abierto que utiliza lenguaje de consulta estructurado (SQL). NO UTILICE esta etiqueta para otras bases de datos como SQL Server, SQLite, etc. Estas son bases de datos diferentes que utilizan sus propios dialectos de SQL para administrar los datos.