通过多行累积减法

时间:2014-10-19 22:09:39

标签: sql tsql sql-server-2012

我想从多行中减去一行。我需要获得剩余数量(由BusTransaction_ID和Artikl区分,并按X_PDateMonth $ DATE排序),这是此减法的结果: Result of two queries

预期结果:

 expected results

结果可以带或不带“零行”。我不知道,如何完成这个结果。并且会更好地使用一些“存储过程”或什么,因为它将用于一个非常大的数据集?

感谢所有回复。

2 个答案:

答案 0 :(得分:1)

这将使用分析函数为您提供“零行”的结果:

select x.*,
       case
         when subqty >= runner
         then 0
         when runner > subqty
          and lag(runner, 1) over( partition by bustransaction_id, artikl
                                   order by bustransaction_id, artikl, xpldate ) > subqty
         then quantity
         else runner - subqty
          end as chk
  from (select s.bustransaction_id,
               s.artikl,
               s.xpldate,
               s.quantity,
               sum(s.quantity) over(  partition by s.bustransaction_id, s.artikl
                                      order by s.bustransaction_id, s.artikl, s.xpldate ) as runner,
               z.quantity as subqty
          from start_table s
          join subtract_table z
            on s.bustransaction_id = z.bustransaction_id
           and s.artikl = z.artikl) x
 order by bustransaction_id, artikl, xpldate

小提琴: http://sqlfiddle.com/#!6/20987/1/0

CASE语句与LAG功能相结合,可识别第一个“半耗尽”行,这是计算中最大的一行。

在那个小提琴中,我包含了我的派生列,这些列是获得你想要的东西所必需的。如果您不想显示这些列,只需从内嵌视图中选择所需的列,如下所示:http://sqlfiddle.com/#!6/20987/2/0

答案 1 :(得分:1)

以下是通过执行以下操作的解决方案:

  1. 计算第一个表中值的累积总和。
  2. 根据累计总和,确定要减去的值。
  3. 查询如下所示:

    select t.bustransaction_id, t.artikl, t.xpldate,
           (case when cumeq <= subt.quantity then 0
                 when cumeq - t.quantity <= subt.quantity
                 then cumeq - subt.quantity
                 else t.quantity
            end) as newquantity       
    from (select t.*,
                 sum(quantity) over (partition by bustransaction_id, artikl order by xpldate) as cumeq
          from start_table t
         ) t left join
         subtract_table subt
         on t.bustransaction_id = subt.bustransaction_id and
            t.artikl = subt.artikl
    order by t.bustransaction_id, t.artikl, t.xpldate;
    

    Here是SQL Fiddle(基于Brians)。