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