有案例

时间:2014-01-18 16:40:13

标签: sql case

我有植物,材料,移动类型和日期。

我的要求是我希望物料和工厂组合中的MAX日期,运动类型条件

首先我需要在材质和植物组合中使用MAX日期,其中移动类型为602,如果602为空则为601,如果601为空则为102,如果102为空则为101,如果101也为其他移动类型,则为101。

为此,我在IDT的派生表中使用了以下代码,但我无法得到正确的结果:

SELECT
DISTINCT
  Table__1."0PLANT",
  Table__1."0MATERIAL",
  Max(Table__1."0PSTNG_DATE") as Last_Sales_Date
FROM
  "NM1"."PUBLIC"."IZDSO_DMR"  Table__1
  Where
      CASE 
        WHEN (Table__1."0MOVETYPE"=602) THEN (Table__1."0MOVETYPE"=602)
        WHEN (Table__1."0MOVETYPE"=602) IS NULL THEN (Table__1."0MOVETYPE"=601)
        ELSE
         (Table__1."0MOVETYPE"=601) END
   Group By
     Table__1."0MATERIAL",
     Table__1."0PLANT"

我只尝试了602,601种运动类型

请帮助我获得正确的结果

1 个答案:

答案 0 :(得分:0)

这是您的where条款:

Where (CASE WHEN (Table__1."0MOVETYPE"=602) THEN (Table__1."0MOVETYPE"=602)
            WHEN (Table__1."0MOVETYPE"=602) IS NULL THEN (Table__1."0MOVETYPE"=601)
            ELSE (Table__1."0MOVETYPE"=601)
      END)

这实际上适用于某些SQL引擎,因为比较转换为数字。但是,我不认为这是你想要的。您希望根据max()列确定0MoveType值的优先级。

SELECT "0PLANT", "0MATERIAL",
       (case when sum(case when "0MOVETYPE" = 602 then 1 else 0 end) > 0
             then max(case when "0MOVETYPE" = 602 then "0PSTNG_DATE" end)
             when sum(case when "0MOVETYPE" = 601 then 1 else 0 end) > 0
             then max(case when "0MOVETYPE" = 601 then "0PSTNG_DATE" end)
             when sum(case when "0MOVETYPE" = 102 then 1 else 0 end) > 0
             then max(case when "0MOVETYPE" = 102 then "0PSTNG_DATE" end)
             when sum(case when "0MOVETYPE" = 101 then 1 else 0 end) > 0
             then max(case when "0MOVETYPE" = 101 then "0PSTNG_DATE" end)
        end) as Last_Sales_Date
\FROM "NM1"."PUBLIC"."IZDSO_DMR"  Table__1
Group By "0MATERIAL", "0PLANT";

如果存在,则返回“602”的上次销售日期。如果不存在,则返回上次销售日期“601”。如果既不存在“601”也不存在“602”,则它变为“102”,依此类推。