当订单具有相同数量的商品时如何使用SUM DISTINCT

时间:2019-07-02 08:46:53

标签: sql oracle sum distinct multiple-columns

我正在处理一个查询,以显示一天中已发送的订单总数和已发送的项目数量。由于连接很多,所以我有重复的行。看起来像这样:

 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 个答案:

答案 0 :(得分:1)

可以进行CTE

    layout = dict(title="IRAN 2016 POPULATION",
              autosize=False,
              width=700,
              height=800,
              hovermode='closest',

              mapbox=dict(accesstoken=MAPBOX_APIKEY,
                          bearing=0,
                          center=dict(
                                    lat=35.715298,
                                    lon=51.404343),
                          pitch=0,
                          zoom=4.9,
                          style = 'dark'),
              sliders=sliders,
              )

答案 1 :(得分:0)

首先,您应该避免在链接时增加行数。例如,使用LEFT JOIN代替JOIN。但是,因为我们在哪里:

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

您键入了SUM(DISTINCT Qty),该值汇总了数量不同的值,即2和5。是7,不是吗?

答案 2 :(得分:0)

尝试一下:

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

我认为您需要发货日期订购明智的总数量。

答案 3 :(得分:0)

  

由于大量的联接,我有重复的行。

恕我直言,您应该首先修复主要数据。 Qty列可能是DispatchDate,Order元组的唯一组合的函数。删除主数据源中的重复项,并确保具有相同Qty的两行不能有不同的DispatchDate,Order。然后回到您的任务,您会发现SQL更加简单。关于其他答案,没有冒犯,但它们只是掩盖了主要数据源中的混乱情况,因此不清楚选择Qty作为重复的DispatchDate,Order(有些花费最大,有些求和)。

答案 4 :(得分:0)

这个怎么样?检查代码中的注释。

(我将order列重命名为corderorder不能用作标识符)。

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>

答案 5 :(得分:0)

如果以这种方式存储数据,则数据模型存在重大问题。在这种情况下,您需要一个表,每个订单有一行。

如果这是查询的结果,则可以修复基础查询,以免重复。

如果您需要使用这种格式的数据,请为每个组提取一行。我认为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

Here是db <>小提琴。