SQL中CASE的条件

时间:2014-02-11 17:32:00

标签: sql sql-server select

根据GORDONS回答,我实现了查询以获得以下输出。

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。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分: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