【问题标题】:Compare 2 subsets of data from table?比较表中的 2 个数据子集?
【发布时间】:2013-07-22 11:38:11
【问题描述】:

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

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

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

这可能吗?

谢谢

【问题讨论】:

  • 你有那个表的主键吗? (每条记录都有一个唯一的 ID 号)?这将使查询变得更容易。
  • 是的,对不起,我在这个例子中简化了很多数据。 “入口号”就是PK。我有一个想法,也许计算可以是:所有行的总和,减去2 *最后一行的数量?如果它让它变得更容易

标签: sql tsql ssms


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      相关资源
      最近更新 更多