Как использовать SUM DISTINCT, если в заказе одинаковое количество товаров - PullRequest
1 голос
/ 02 июля 2019

Я работаю над запросом, чтобы показать мне общее количество отправленных заказов и кол-во отправленных товаров за день.Из-за большого количества соединений у меня есть повторяющиеся строки.Это выглядит так:

 DispatchDate   Order   Qty 
   2019-07-02       1     2
   2019-07-02       1     2
   2019-07-02       1     2
   2019-07-02       2     2
   2019-07-02       2     2
   2019-07-02       2     2
   2019-07-02       3     5
   2019-07-02       3     5
   2019-07-02       3     5

Я использую этот запрос:

SELECT DispatchDate, COUNT(DISTINCT Order), SUM(DISTINCT Qty)
FROM TABLE1
GROUP BY DispatchDate

Очевидно, на эту дату было 3 заказа с общим количеством предметов, равным 9

Тем не менее, запрос возвращает:

3 заказа и 7 предметов

Я понятия не имею, как решить эту проблему.Как можно суммировать количества для каждого заказа вместо простого удаления дубликатов только из одного столбца, как это делает SUM DISTINCT

Ответы [ 6 ]

1 голос
/ 02 июля 2019

Может сделать CTE

with cte1 as (
SELECT Order AS Order
    , DispatchDate
    , MAX(QTY) as QTY
FROM FROM TABLE1
GROUP BY Order
    , DispatchDate
)

SELECT DispatchDate
     , COUNT(Order)
     , SUM(Qty)
FROM cte1
GROUP BY DispatchDate
0 голосов
/ 02 июля 2019

У вас серьезные проблемы с вашей моделью данных, если данные хранятся таким образом.Если это так, вам нужна таблица с одной строкой на order .

Если это результат запроса, вы, вероятно, можете исправить базовый запрос, чтобы не получать дубликаты.

Если вам нужно работать с данными в этом формате, извлеките по одной строке для каждой группы.Я думаю, что row_number() вполне подходит для этой цели:

select count(*), sum(qty) 
from (select t.*, row_number() over (partition by dispatchdate, corder order by corder) as seqnum
      from t
     ) t
where seqnum = 1

Здесь - это db <> скрипка.

0 голосов
/ 02 июля 2019

Как насчет этого? Проверьте комментарии в коде.

(я переименовал столбец order в corder; order нельзя использовать в качестве идентификатора).

SQL> WITH test (dispatchdate, corder, qty)
  2       -- your sample data
  3       AS (SELECT DATE '2019-07-02', 1, 2 FROM DUAL UNION ALL
  4           SELECT DATE '2019-07-02', 1, 2 FROM DUAL UNION ALL
  5           SELECT DATE '2019-07-02', 1, 2 FROM DUAL UNION ALL
  6           --
  7           SELECT DATE '2019-07-02', 2, 2 FROM DUAL UNION ALL
  8           SELECT DATE '2019-07-02', 2, 2 FROM DUAL UNION ALL
  9           SELECT DATE '2019-07-02', 2, 2 FROM DUAL UNION ALL
 10           --
 11           SELECT DATE '2019-07-02', 3, 5 FROM DUAL UNION ALL
 12           SELECT DATE '2019-07-02', 3, 5 FROM DUAL UNION ALL
 13           SELECT DATE '2019-07-02', 3, 5 FROM DUAL),
 14       -- compute sum of distinct qty per BOTH dispatchdate AND corder
 15       temp
 16       AS (  SELECT t1.dispatchdate,
 17                    t1.corder,
 18                    SUM (DISTINCT t1.qty) qty
 19               FROM test t1
 20           GROUP BY t1.dispatchdate,
 21                    t1.corder
 22          )
 23    -- the final result is then simple
 24    SELECT t.dispatchdate,
 25           COUNT (*) cnt,
 26           SUM (qty) qty
 27      FROM temp t
 28  GROUP BY t.dispatchdate;

DISPATCHDA        CNT        QTY
---------- ---------- ----------
02.07.2019          3          9

SQL>
0 голосов
/ 02 июля 2019

Из-за большого количества объединений у меня есть повторяющиеся строки.

ИМХО, сначала вы должны исправить свои первичные данные. Вероятно, столбец Qty является функцией уникальной комбинации кортежа DispatchDate,Order. Удалите дубликаты в первичном источнике данных и убедитесь, что не может быть разного Qty для двух строк с одинаковым DispatchDate,Order. Затем вернитесь к своей задаче, и вы обнаружите, что ваш SQL намного проще. Не обижайтесь на другие ответы, но они просто маскируют беспорядок в первичном источнике данных и неясно, выберут ли Qty для дубликата DispatchDate,Order (некоторые принимают максимум, некоторые получают сумму).

0 голосов
/ 02 июля 2019

Попробуйте:

SELECT DispatchDate, COUNT(DISTINCT Order), SUM(DISTINCT Qty)
FROM TABLE1
GROUP BY DispatchDate, Order

Я думаю, вам нужно дата отправки и заказ мудрая сумма определенного количества.

0 голосов
/ 02 июля 2019

Во-первых, вы должны избегать умножения строк при компоновке.Как, например, использование LEFT JOIN вместо JOIN.Но поскольку мы находимся где:

SELECT    DispatchDate,  sum( Qty)
FROM (
SELECT distinct DispatchDate,  Order,  Qty
FROM TABLE1 )T
GROUP BY  DispatchDate

вы ввели SUM (DISTINCT Qty), который суммировал различные значения для Qty, то есть 2 и 5. Это 7, не так ли?

...