SQL如何将SELECT查询下的CASE分配给变量?

时间:2017-04-04 09:37:36

标签: sql sql-server

我有这个SQL SELECT查询。

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分配给变量,以便我可以用更整洁的代码替换它。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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