COUNT (INVOICE.INV_NUM) дает разные ответы в двух разных сценариях - PullRequest
0 голосов
/ 02 мая 2018

Я написал запрос, в котором я хочу отобразить «Номер клиента» (таблица CUSTOMER), «Число счетов» (таблица «INVOICE»), то есть общее количество счетов для каждого клиента, и «Всего покупок Cus» (рассчитывается путем объединения таблиц CUSTOMER, INVOICE и LINE), которая представляет собой сумму всех покупок во всех счетах, принадлежащих каждому клиенту.

В первом запросе указано неправильное «количество счетов».

--First Query    
SELECT CUSTOMER.CUST_NUM AS "Customer Number",
COUNT(INVOICE.INV_NUM) AS "Number of Invoices",
SUM(LINE.LINE_UNITS * LINE.LINE_PRICE) AS "Total Cus Purchases"
FROM CUSTOMER
JOIN INVOICE
ON CUSTOMER.CUST_NUM = INVOICE.CUST_NUM
JOIN LINE
ON INVOICE.INV_NUM = LINE.INV_NUMBER
GROUP BY CUSTOMER.CUST_NUM;

Customer Code Number of Invoices Total Cus Purchases

     1000              5              188.72
     1003              6               432.8
     1001              3               34.92
     1002              1               70.44

Тем не менее, второй запрос (это замечено, когда опущен оператор соединения для LINE, который используется для вычисления "Всего покупок Cus"), выдает правильное "Количество счетов".

--Second Query
SELECT 
CUSTOMER.CUST_NUM AS "Customer Number", 
COUNT(INVOICE.INV_NUM) AS "Number of Invoices"
FROM INVOICE
JOIN CUSTOMER ON INVOICE.CUST_NUM = CUSTOMER.CUST_NUM
GROUP BY CUSTOMER.CUST_NUM;

Customer Code Number of Invoices

     1000                  3
     1003                  2
     1001                  2
     1002                  1

Как мне исправить первый запрос, чтобы он выплевывал значения, показанные во втором запросе?

(Примечание. Общая сумма покупок правильная, неправильный столбец «Количество счетов»).

1 Ответ

0 голосов
/ 02 мая 2018

COUNT(DISTINCT) решает проблему подсчета, но вы также можете упростить запрос, удалив таблицу JOIN в CUSTOMER:

SELECT i.CUST_NUM AS "Customer Number",
       COUNT(DISTINCT i.INV_NUM) AS "Number of Invoices",
       SUM(l.LINE_UNITS * l.LINE_PRICE) AS "Total Cus Purchases"
FROM INVOICE i JOIN
     LINE l
     ON i.INV_NUM = l.INV_NUMBER
GROUP BY i.CUST_NUM;

Вы используете CUST_NUM и оно находится в таблице INVOICE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...