MySQL агрегированный запрос на выборку, возвращающий неверные данные - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть следующий код:

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;

В моем запросе должно быть возвращено 10 строк данных, и у меня только 7 возвращений, и ни одна из них с правильной информацией. То, что я должен был возвратить, является столбцом account_description из таблицы general_ledger_accounts, количеством элементов в таблице invoice_line_items, суммой столбцов line_item_amount в таблице invoice_line_items, которые имеют тот же номер счета. Поиск следует выполнять только в счетах между датами «2014-04-01» и «2014-06-30». Я должен присоединиться к таблице счетов-фактур.

Кто-нибудь может увидеть, что я неправильно делаю в своем синтаксисе, чтобы получить неправильные результаты?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Я подозреваю, что вы хотите удалить столбцы i.invoice_date и ili.account_number из предложения group by. В противном случае вы получите одну запись на отдельные значения этих трех столбцов, что, кажется, не то, что вам нужно.

Соответственно, вы должны переместить фильтр по датам в предложение 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;

Обратите внимание, что я изменил условие для дат, чтобы использовать полуоткрытые интервалы: таким образом, вам не нужно беспокоиться о том, будет ли в прошлом месяце 30 или 31 день (или 28, или 29). .); это также будет плавно обрабатывать временную часть дат, если таковые имеются.

0 голосов
/ 16 февраля 2020

Очевидно, что вам нужно предложение WHERE, а не предложение HAVING для фильтрации по датам и удаления даты из GROUP BY (вы ее не выбираете):

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;

Я не знаю, есть ли другие проблемы.

...