2017-04-04 5 views
0

私はこのSQL SELECTクエリを持っています。SQL SELECTクエリの下でCASEを変数に割り当てる方法は?

SELECT STOCK 
    ,QTY*PRICE AS 'TOTAL' 
    ,(QTY*PRICE)*RATE AS 'VALUATION' 
    ,((QTY*PRICE)*RATE)+1 AS 'ADD_VALUATION' 
    ,CASE WHEN GRP = 'A' THEN 100 - isnull(LDP_A,0) 
    WHEN GRP = 'B' THEN 100 - isnull(LDP_B,0) 
    WHEN GRP = 'C' THEN 100 - isnull(LDP_C,0) 
    -- TO Z 
    END AS 'LDP' 
    ,(((QTY*PRICE)*RATE)+1) 
     /
     (CASE WHEN GRP = 'A' THEN 100 - isnull(LDP_A,0) 
     WHEN GRP = 'B' THEN 100 - isnull(LDP_B,0) 
     WHEN GRP = 'C' THEN 100 - isnull(LDP_C,0) 
     -- TO Z 
     END) * RATE AS HTC 
FROM STOCKBL 

このようなステートメントの冗長性を除去する方法はありますか?どのようにCASEを変数に代入することができるので、これをもっときちんとしたコードに置き換えることができます。

あなたが CROSS APPLYを使用することができますSQL Serverでの
+0

は、MySQLやSQL Serverのこのですか? –

+0

@GiorgosBetsosそれはSQLサーバーです。謝罪 – theo

+0

GRPとは何ですか? – Rajan

答えて

3

SELECT STOCK 
     ,t2.TOTAL AS 'TOTAL' 
     ,t2.TOTAL*RATE AS 'VALUATION' 
     ,(t2.TOTAL*RATE)+1 AS 'ADD_VALUATION' 
     ,t1.LDP AS 'LDP' 
     ,((t2.TOTAL*RATE)+1)/t1.LDP * RATE AS HTC 
FROM STOCKBL 
CROSS APPLY (
    SELECT CASE 
      WHEN GRP = 'A' THEN 100 - isnull(LDP_A,0) 
      WHEN GRP = 'B' THEN 100 - isnull(LDP_B,0) 
      WHEN GRP = 'C' THEN 100 - isnull(LDP_C,0) 
      -- TO Z 
      END AS LDP) AS t1 
CROSS APPLY (SELECT QTY*PRICE AS TOTAL) AS t2 
+0

これは私が欲しいものです。助けをありがとうございました:) – theo

2

あなたは、以下のようCTEまたはサブクエリを使用することができます。

;with cte as 
(
SELECT STOCK 
    ,QTY*PRICE AS 'TOTAL' 
    ,(QTY*PRICE)*RATE AS 'VALUATION' 
    ,CASE WHEN GRP = 'A' THEN 100 - isnull(LDP_A,0) 
    WHEN GRP = 'B' THEN 100 - isnull(LDP_B,0) 
    WHEN GRP = 'C' THEN 100 - isnull(LDP_C,0) 
    -- TO Z 
    END AS 'LDP' 
    , RATE 
FROM STOCKBL 
) 
SELECT Stock, total, Valuation, Valuation + 1 as 'ADD_VALUATION', 
     ((Valuation+1)/ LDP) * Rate) as HTC from cte 
+0

ありがとう – theo

関連する問題