如何使用空值添加/减去多个选择语句

问题描述 投票:0回答:1

我正在尝试减去两个不同的select语句的值。第一个选择语句返回一个值,并且永远不会为空,但是第二个选择语句可能返回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
1个回答
0
投票

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

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

SELECT 
    SUM(AMOUNT) - SUM(CASE WHEN PAY_TYPE = @PayType THEN AMOUNT ELSE 0 END) diff
FROM MyTable  
where  ACCOUNT_NUMBER = @AccountNumber
AND PAY_PERIOD = @PayPeriod
AND PAY_TYPE = @PayType
© www.soinside.com 2019 - 2024. All rights reserved.