比较表中的2个数据子集?

时间:2013-07-22 11:38:11

标签: sql tsql ssms

我不确定这是否可行 - 我真的遇到了麻烦。

这是针对产品计划,显示我们预计在给定日期交付的数量。每周将数据导入此计划,这将创建一个新条目。

例如,如果当天的日程安排总计为10,并且导入15,则会插入一个新行,数量为5,将总和设为15。

我的数据是这样的:

Product | Delivery Required Date | Qty 
Prod1   |       1/1/13           | 10
Prod1   |       1/1/13           | -10
Prod1   |       1/1/13           | 10
Prod1   |       1/1/13           | -10
Prod1   |       1/1/13           | 25

我想设计一个查询,显示上一个时间表和当前时间表之间的差异。

例如,查询将汇总所有行“Qty”,不包括最后一个条目 - 并将其与最后一个条目进行比较。在上面的数据中,方差为25(现有总数为0,最新条目为25,0 + 25 = 25)。

这可能吗?

由于

2 个答案:

答案 0 :(得分:0)

我怀疑使用Common Table Expressions有更好的答案,但是快速和快速。丑陋的解决方案可能是

select sum(case when EntryNo <> MAX(EntryNo) then Qty else 0 end) as 'sumLessLast'
from MyTable

如果MyTable中有一百万行,您需要一个更好的解决方案。

答案 1 :(得分:0)

SqlServer 2005和2008:

;with r1 as (
    select DeliveryReqDate, sum(Qty) as TotalQty
    from TableName
    group by DeliveryReqDate)
, r2 as (
    select DeliveryReqDate, Qty
        , row_number() over (partition by DeliveryReqDate order by EntryNo desc) rn
    from TableName)
select r1.DeliveryReqDate, r1.TotalQty, r2.Qty as LastQty
    , r1.TotalQty - r2.Qty as TotalButLastQty
from r1
    join r2 on r2.DeliveryReqDate = r1.DeliveryReqDate and r2.rn = 1

SqlServer 2012

;with r1 as (
    select DeliveryReqDate, Qty
        , sum(Qty) over (partition by DeliveryReqDate) as TotalQty
        , row_number() over (partition by DeliveryReqDate order by EntryNo desc) rn
from TableName)
select DeliveryReqDate, TotalQty, Qty as LastQty
    , TotalQty - Qty as TotalButLastQty
from r1
where rn = 1

我不确定我是否完全理解有关产品和日期会计的逻辑,但我希望您能够根据您的需求调整上述查询。