SQL子查询逻辑

时间:2014-04-30 16:39:49

标签: sql

我正在尝试计算名为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

由于

3 个答案:

答案 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
相关问题