我正在尝试计算名为Peak的列中的值,但我需要根据'ChargeCode'应用不同的计算。
以下是我想要做的事情,但它会产生3个名为Peak的列 - 我知道这就是我要求的:)
任何人都可以帮助使用正确的语法,这样我最终会得到一个名为Peak的列吗?
Use Test
Select Chargecode,
(SELECT 1 Where Chargecode='1') AS [Peak],
(SELECT 1 Where Chargecode='1242') AS [Peak],
Peak*2 AS [Peak],
CallType
from Daisy_March2014
由于
答案 0 :(得分:1)
您需要case
声明。我认为这就是你要找的东西:
Select Chargecode,
(case when chargecode = '1'
when chargecode = '1242' then 2
else 2 * Peak
end) as Peak,
CallType
from Daisy_March2014;
答案 1 :(得分:0)
感谢戈登,我已将您的回复标记为已答复。这是最终的工作代码:
(case when chargecode in ('1') then 1 when chargecode in ('1264') then 2 else Peak*2 end) as Peak,
答案 2 :(得分:0)
由于这取决于您的收费代码,我会做出一个疯狂的假设,即这可能是一个持续的事情,可以添加新的收费代码/规则。为什么不将它作为元数据存储在收费代码表或新表中?您可以使用以下方法生成初始数据:
SELECT ChargeCode,
Multiplier
INTO ChargeMeta
FROM (
Select 1 AS ChargeCode,
1 AS Multiplier
UNION ALL
SELECT 1242 AS ChargeCode,
1 AS Multiplier
UNION ALL
SELECT ChargeCode,
2 AS Multiplier
FROM Daisy_March2014
WHERE ChargeCode NOT IN (1,1242)
) SQ
然后加入原始数据。
SELECT a.ChargeCode,
a.Peak*b.Multiplier AS Peak
FROM Daisy_March2014 a
JOIN ChargeMeta b
ON a.ChargeCode = b.ChargeCode
如果您不想维护所有费用代码乘数,则可以维护非标准乘数,并将标准存储在SQL中。这与case语句大致相同,但它仍然可以增加将覆盖存储在表中的好处。至少,它可以更容易地在其他地方重复使用。如果ChargeCode 42需要设置新的乘数,则无需检查处理Peak值的所有查询并使它们保持一致。
如果要在表中存储默认值,可以使用两个连接而不是一个连接,将默认费用代码存储在永远不会使用的值下。 (-1?)
SELECT a.ChargeCode,
a.Peak*COALESCE(b.Multiplier,c.Multiplier) AS Peak
FROM Daisy_March2014 a
LEFT JOIN ChargeMeta b ON a.ChargeCode = b.ChargeCode
LEFT JOIN ChargeMeta c ON c.ChargeCode = -1