2017-04-04 38 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賦值給一個變量,這樣我就可以用更整潔的代碼來替換它。

+0

這是MySQL或SQL Server? –

+0

@GiorgosBetsos它是SQL服務器。道歉 – theo

+0

什麼是GRP的情況下? – Rajan

回答

3

在SQL Server中,你可以使用CROSS APPLY

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

相關問題