1

我不确定这是否可能——我很难理解它。

这是一个产品计划,显示我们期望在给定日期交付多少。每周将数据导入此计划,从而创建一个新条目。

例如,如果当天的计划当前总计 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

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

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

这可能吗?

谢谢

4

2 回答 2

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

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

于 2013-07-22T16:30:05.317 回答
0

我怀疑使用公用表表达式会有更好的答案,但可能是一个快速而丑陋的解决方案

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

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

于 2013-07-22T11:54:02.827 回答