2014-02-11 36 views
3

根据GORDONS答案我实现了查询以获得以下输出。SQL中的CASE条件

ROW_ID  ARTIKEL  SUPPLIERID  ORGID  PIECES  COSTPRICE  DISCOUNT VALUE_DRILL_DOWN 
1   TV   SONY   922   6   110   2.5   14 
2   TV   SONY   922   10   80   1   4 
3   TV   SONY   922   6   65   1.5   0 
4   TV   SONY   922   14   95   1.5   0 
5   TV   SONY   922   18   95   1.5   0 
6   TV   SONY   922   4   95   1.5   0 

我的查询如下:

SELECT "SUPPLIERID","ARTIKEL",(case when @x - "cumlativesum") < 0 then NULL else (@x - "cumlativesum") end) as "VALUE_DRILL_DOWN" 
from 
(SELECT T1."ARTIKEL",T1."SUPPLIERID",(select sum("PIECES") from EXAMPLE_TABLE T2 where T2."ROW_ID" <= T1."ROW_ID"and T2."SUPPLIERID" = T1."SUPPLIERID" and T2."ARTIKEL"=T1."ARTIKEL") as "cumlativesum" from :EXAMPLE_TABLE T1) 

但我想以这样的方式输出:

ROW_ID  ARTIKEL  SUPPLIERID  ORGID  PIECES  COSTPRICE  DISCOUNT VALUE_DRILL_DOWN 
1   TV   SONY   922   6   110   2.5   14 
2   TV   SONY   922   10   80   1   4 
3   TV   SONY   922   6   65   1.5   0 
4   TV   SONY   922   14   95   1.5   Null 
5   TV   SONY   922   18   95   1.5   Null 
6   TV   SONY   922   4   95   1.5   Null 

我想要的参加计算,即从行1的行到3只有值和所有不参与计算的行都是NULL。 正如我们在第三行所看到的,值是(4-6 = -2)。即使该值为负值,该行也是值“20”的一部分。因此,该值设置为0而不是-2NULL。 如果将条件更改为(case when @x - "cumlativesum") < 0 then NULL,则值超出0的所有行都将设置为NULL。

任何建议,将不胜感激。

回答

2

您可以通过查找第一次累积总数通过/达到0的记录来获得所需的数据。你可以通过减去你正在积累的值来做到这一点。我认为查询看起来像:

SELECT "SUPPLIERID", "ARTIKEL", 
     (case when @x - cumulativesum <= 0 and @x - (cumulativesum -BZBAS_AW) > 0 
      then 0 
      when @x - "cumulativesum" <= 0 
      then NULL 
      else @x - "cumulativesum" 
     end) as "VALUE_DRILL_DOWN" 
from (SELECT T1."ARTIKEL", T1."SUPPLIERID", T1.BZBAS_AW 
      (select sum("BZBAS_AW") 
       from EXAMPLE_TABLE T2 
       where T2."ROW_TEST" <= T1."ROW_TEST" and T2."LIFNR" = T1."LIFNR" and T2."ARTIKEL"=T1."ARTIKEL" 
      ) as "cumulativesum" 
    from EXAMPLE_TABLE T1 
    ) t 
+0

非常感谢。这严重影响了我的想法。你节省了我的一天。非常感谢。 CHeers :) –

+0

嘿戈登,你的支持到现在一直是巨大的。不过,我想问你最后一个忙。我只是发布这个问题http://stackoverflow.com/questions/21727215/nested-case-in-sql。查询的一个小增强将解决我的问题。请帮忙。谢谢 –