在哪里以及如何使用CASE WHEN SQL多个子查询

时间:2014-05-16 04:01:36

标签: sql sql-server tsql

我很想知道在下面的查询中我将在何处以及如何使用CASE语句,但仅适用于外部查询,即最终结果。我希望我的CASE语句反映这些值,即CASE WHEN 'TOTAL OH INV' - P1.[REM PLAN QTY] < = 100 THEN 'URGENT'等,以获得不同的资格。这会在我第一次选择后直接开始吗?

DECLARE @number as int
SET     @number = CASE
                  WHEN DATENAME(dw,GETDATE()) = 'Monday'
                  THEN 56
                  WHEN DATENAME(dw,GETDATE()) = 'Tuesday' 
                  THEN 57
                  WHEN DATENAME(dw,GETDATE()) = 'Wednesday' 
                  THEN 58
                  WHEN DATENAME(dw,GETDATE()) = 'Thursday' 
                  THEN 59
                  WHEN DATENAME(dw,GETDATE()) = 'Friday' 
                  THEN 60
                  END;


SELECT          P1.PLANT_CODE,
                P1.STOCK_CATEGORY,
                P1.MATERIAL,
                M1.DESCRIPTION,
                M1.DEPT,
                M1.RMH_PRODUCT_DIVISION,
                M1.RMH_GENDER_AGE,
                P1.DISTRIBUTION_VERSION_CODE,
                P1.PERIOD_CODE,
                P1.REQUIREMENTS_DATE,
                P1.VERSION_IND_FLAG,
                P1.TECHNICAL_INDEX,
                P1.SIZE_LITERAL,
                P1.[ORIGINAL FCST QTY],
                P1.WITHDRAWN_QUANTITY,
                P1.[REM PLAN QTY],
                P2.FUTURE_FCST,
                SUM(I1.ON_HAND_QUANTITY) AS 'TOTAL_OH_INV'
FROM


(SELECT         P.PLANT_CODE,
                P.STOCK_CATEGORY,
                P.MATERIAL,
                P.DISTRIBUTION_VERSION_CODE,
                P.PERIOD_CODE,
                P.REQUIREMENTS_DATE,
                P.PLANNED_QTY AS 'REM PLAN QTY',
                P.VERSION_IND_FLAG,
                P.SIZE_LITERAL,
                P.WITHDRAWN_QUANTITY,
                P.TECHNICAL_INDEX,
                P.PLANNED_QTY + P.WITHDRAWN_QUANTITY AS 'ORIGINAL FCST QTY'
 FROM           VW_PLANNED_REQMNTS_TXT P
 WHERE          P.PLANT_CODE IN ('6040','6041')
 AND            P.STOCK_CATEGORY IN ('A60385000','A60385003')
 AND            P.DISTRIBUTION_VERSION_CODE IN ('00','01','ZU','Z2')
 AND            P.REQUIREMENTS_DATE < GETDATE() - @number
 AND            P.PLANNED_QTY > 0) AS P1

 LEFT OUTER JOIN      

 (SELECT
                SUM(P.PLANNED_QTY) AS 'FUTURE_FCST',
                P.MATERIAL,
                P.TECHNICAL_INDEX
 FROM           VW_PLANNED_REQMNTS_TXT P
 WHERE          P.REQUIREMENTS_DATE >= GETDATE()
 AND            P.PLANNED_QTY > 0
 AND            P.STOCK_CATEGORY IN ('A60385000','A60385003')
 GROUP BY       P.MATERIAL,
                P.TECHNICAL_INDEX,
                P.SIZE_LITERAL) AS P2
 ON             P1.MATERIAL = P2.MATERIAL
 AND            P1.TECHNICAL_INDEX = P2.TECHNICAL_INDEX

 LEFT OUTER JOIN 

 (SELECT        I.ON_HAND_QUANTITY,
                I.TECHNICAL_INDEX,
                I.MATERIAL,
                I.STOCK_CATEGORY,
                I.PLANT_CODE
  FROM          VW_INVENTORY I
  WHERE         I.STOCK_CATEGORY IN ('A60385000','A60385003')
  GROUP BY      I.TECHNICAL_INDEX,
                I.MATERIAL,
                I.STOCK_CATEGORY,
                I.ON_HAND_QUANTITY,
                I.PLANT_CODE) AS I1
  ON            P1.MATERIAL = I1.MATERIAL
  AND           P1.TECHNICAL_INDEX = I1.TECHNICAL_INDEX
  AND           P1.PLANT_CODE = I1.PLANT_CODE

  LEFT OUTER JOIN

  (SELECT       M.MATERIAL, 
                M.DESCRIPTION,
                M.DEPT,
                M.SUB_SEGMENT,
                M.RMH_PRODUCT_DIVISION,
                M.RMH_GENDER_AGE,
                M.RMH_CATEGORY
    FROM        VW_MM_MATERIAL M) AS M1

    ON          P1.MATERIAL = M1.MATERIAL


  GROUP BY      P1.PLANT_CODE,
                P1.STOCK_CATEGORY,
                P1.MATERIAL,
                P1.DISTRIBUTION_VERSION_CODE,
                P1.PERIOD_CODE,
                P1.REQUIREMENTS_DATE,
                P1.[REM PLAN QTY],
                P1.VERSION_IND_FLAG,
                P1.WITHDRAWN_QUANTITY,
                P1.SIZE_LITERAL,
                P1.TECHNICAL_INDEX,
                P1.[ORIGINAL FCST QTY],
                P2.FUTURE_FCST,
                M1.DESCRIPTION,
                M1.DEPT,
                M1.RMH_PRODUCT_DIVISION,
                M1.RMH_GENDER_AGE


 ORDER BY       P1.MATERIAL,
                P1.TECHNICAL_INDEX;

1 个答案:

答案 0 :(得分:1)

我通常通过将整个select语句包装在另一个select中然后将我的case语句添加到该语句来完成此操作。即

SELECT field_list, CASE WHEN 'TOTAL OH INV' - P1.[REM PLAN QTY] < = 100 THEN 'URGENT' 
FROM (put your existing select statement here)

这样,所有计算都在CASE语句之前执行,只过滤最终结果。