2017-04-04 7 views
0

Ich habe diese SQL SELECT-Abfrage.SQL wie CASE unter SELECT-Abfrage auf eine Variable zuweisen?

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 

Gibt es eine Möglichkeit, diese Redundanz von Anweisungen zu bereinigen? Wie kann ich den CASE einer Variablen zuweisen, so kann ich dies durch saubereren Code ersetzen.

+0

Ist das für MySQL oder SQL Server? –

+0

@GiorgosBetsos es ist SQL Server. Entschuldigung – theo

+0

Was ist GRP im Fall? – Rajan

Antwort

3

In SQL Server können Sie CROSS APPLY verwenden:

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

Das ist was ich will. Vielen Dank für die Hilfe :) – theo

2

Sie können wie unten CTE oder Unterabfrage verwenden:

;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

Vielen Dank für Ihre Antwort – theo