我正在处理一个查询,以显示一天中已发送的订单总数和已发送的项目数量。由于连接很多,所以我有重复的行。看起来像这样:
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那样仅从一列中删除重复的商品
答案 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
列重命名为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>
答案 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 <>小提琴。