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