如何解决SQL:如何在新列计算中使用CASE WHEN输出
我试图将CASE WHEN的输出用于不同的列计算,但是我不太清楚该怎么做。
示例:
CASE
WHEN (T.Delivery_Option = 'International Standard') AND (T.[Net_Qty] * T.[Unit_Charge]) < 50 THEN 4.99
WHEN (T.Delivery_Option = 'International Standard') AND (T.[Net_Qty] * T.[Unit_Charge]) >= 50 THEN 0
ELSE 0
END AS 'Test',
要在不同的计算中使用“测试”的输出,我需要做什么,例如:
T.[Net_Qty] / test
解决方法
重用它的最简单方法可能是使用common table expression (CTE):
WITH cte AS (
SELECT *,CASE
WHEN (T.Delivery_Option = 'International Standard') AND (T.[Net_Qty] * T.[Unit_Charge]) < 50 THEN 4.99
WHEN (T.Delivery_Option = 'International Standard') AND (T.[Net_Qty] * T.[Unit_Charge]) >= 50 THEN 0
ELSE 0
END AS Test
FROM T
)
SELECT Net_Qty / Test
,
一种选择是将您当前的逻辑放入CTE中,然后对其进行子查询:
WITH cte AS (
SELECT *,CASE WHEN Delivery_Option = 'International Standard' AND [Net_Qty] * T.[Unit_Charge] < 50 THEN 4.99
WHEN Delivery_Option = 'International Standard' AND [Net_Qty] * T.[Unit_Charge] >= 50 THEN 0
ELSE 0 END AS test
FROM yourTable
)
SELECT [Net_Qty] / test AS item
FROM cte;
,
您可以像这样使用子查询
import Gradient from "javascript-color-gradient";
const colorGradient = new Gradient();
colorGradient.setGradient("#e6062d","#408247"); // from red to green
colorGradient.setMidpoint(8); // set to 8 color steps
colorGradient.getArray(); // get all 8 colors: [ "#d11630","#bd2534",... ]
colorGradient.getColor(1); // #bd2534
,
SQL Server支持横向联接。这是一个很棒的功能,可让您在FROM
子句中定义新列。 。 。然后可以在整个查询中使用它们:
SELECT . . .,v.test,t.Net_Qty / NULLIF(v.Test,0)
FROM T CROSS APPLY
(VALUES (CASE WHEN T.Delivery_Option = 'International Standard' AND T.[Net_Qty] * T.[Unit_Charge] < 50 THEN 4.99
WHEN T.Delivery_Option = 'International Standard' AND T.[Net_Qty] * T.[Unit_Charge] >= 50 THEN 0
ELSE 0
END)
) v(Test)
还要注意使用NULLIF()
。 Test
可以轻松采用0
的值,因此您需要考虑到这一点。实际上,不需要第二个WHEN
,因为它返回的值与ELSE
相同,因此可以简化为:
FROM T CROSS APPLY
(VALUES (CASE WHEN T.Delivery_Option = 'International Standard' AND T.[Net_Qty] * T.[Unit_Charge] < 50 THEN 4.99
ELSE 0
END)
) v(Test)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。