【问题标题】:How to add/subtract multiple select statements with null values如何添加/减去具有空值的多个选择语句
【发布时间】:2019-12-18 22:36:30
【问题描述】:

我正在尝试减去两个不同选择语句的值。第一个 select 语句返回一个值并且永远不会为 null,但第二个可能返回 NULL。如何用零值替换 NULL?我尝试使用 COALESCE 但仍然得到一个 NULL 值作为回报(示例 1)。我尝试将两个 select 语句插入到单独的表中并使用 ISNULL(示例 2)。我还在临时表中尝试了一个 case 语句,但这也不起作用(示例 3)。 示例 1:

    Declare @AccountNumber varchar(50) = '1234'
    ,@PayType varchar(15) = 'Full'
    ,@PayPeriod varchar(50) = '2019/05/31'
BEGIN
SELECT (
    SELECT SUM(MyTable.AMOUNT)
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType) -
    (SELECT COALESCE(MyTable.AMOUNT,0)
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType
    AND CODE = 'ABC')AS FINALRESULT
END

示例 2:

    Declare @AccountNumber varchar(50) = '1234'
    ,@PayType varchar(15) = 'Full'
    ,@PayPeriod varchar(50) = '2019/05/31'
BEGIN
WITH tempTable1 as (
    (SELECT SUM(MyTable.AMOUNT) as Result
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType)
    )
        ,tempTable2 as(
    (SELECT MyTable.AMOUNT AS Result2
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType
    AND CODE = 'ABC')
    )
    SELECT (SELECT SUM(Result) FROM tempTable1) - (SELECT ISNULL(Result2 FROM tempTable2),0) as FINALRESULT
END

示例 3:

    Declare @AccountNumber varchar(50) = '1234'
    ,@PayType varchar(15) = 'Full'
    ,@PayPeriod varchar(50) = '2019/05/31'
BEGIN
WITH tempTable1 as (
    (SELECT SUM(MyTable.AMOUNT) as Result
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType)
    )
        ,tempTable2 as(
    (SELECT MyTable.AMOUNT AS Result2
    FROM MyTable  
    where  MyTable.ACCOUNT_NUMBER = @AccountNumber
    AND MyTable.PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType
    AND CODE = 'ABC')
    )
    SELECT (SELECT SUM(Result) FROM tempTable1) - (
    SELECT
CASE
    WHEN Result2 IS NOT NULL THEN Result2
    ELSE '0'
END AS Result2
FROM tempTable2
    ) as FINALRESULT
END

最终,我需要 Result1(100) - Result2(NULL) = 100

【问题讨论】:

    标签: sql sql-server tsql group-by pivot


    【解决方案1】:

    您可以用COALESCE() 包围第二个子查询以在没有返回匹配时返回0

    但最重要的是,我认为您的查询可以简化为使用条件聚合:

    SELECT 
        SUM(AMOUNT) - SUM(CASE WHEN CODE = 'ABC' THEN AMOUNT ELSE 0 END) diff
    FROM MyTable  
    where  ACCOUNT_NUMBER = @AccountNumber
    AND PAY_PERIOD = @PayPeriod
    AND PAY_TYPE = @PayType
    

    【讨论】:

    • 问题是CODE = 'ABC'只需要在第二个select语句中。
    • @Shane:是的,我刚刚在我的回答中解决了这个问题。我希望它现在应该做你想做的事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多