Sql 当订单具有相同数量的项目时,如何使用SUM DISTINCT

Sql 当订单具有相同数量的项目时,如何使用SUM DISTINCT,sql,oracle,sum,distinct,multiple-columns,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

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

 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那样简单地从一列中删除重复项

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

首先,在链接时应该避免行的乘法。例如,使用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,不是吗?

试试这个:

SELECT DispatchDate, COUNT(DISTINCT Order), SUM(DISTINCT Qty)
FROM TABLE1
GROUP BY DispatchDate, Order
我想你们需要不同数量的发货日期和订单

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


首先,你应该修复你的主要数据。可能
Qty
列是
DispatchDate、Order
元组的唯一组合的函数。删除主数据源中的重复项,并确保具有相同发货日期、订单的两行的
数量不能不同。然后回到您的任务,您会发现您的SQL要简单得多。对于其他答案没有冒犯之意,但它们只是掩盖了主要数据源中的混乱,并且不清楚如何选择重复的
发货日期、订单
(一些取最大值,一些取总值)。

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

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


如果数据是以这种方式存储的,那么您的数据模型就会出现重大问题。如果是这种情况,则需要一个表,每个订单一行

如果这是查询的结果,您可能可以修复基础查询,这样就不会得到重复的查询

如果需要使用此格式的数据,则为每个组提取一行。我认为
row\u 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

是一个数字小提琴。

请分享您的预期结果。总(数量)
?你需要告诉我们你在这里期望得到什么样的结果,因为我不明白你在这里试图用数量字段做什么。预期结果是3个订单和9个数量。使用SUM(数量)给我35个数量,SUM(不同数量)给我7个数量。
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