SUM CASE - 如果为NULL,则不显示记录

时间:2014-07-03 18:31:58

标签: sql sql-server-2008 case

我使用以下声明:

    SELECT 
        Number As [ACCOUNT NUMBER],
        SUM(CASE WHEN [Paid_Pmt_Dt] >= '05/01/2014'
        AND[Paid_Pmt_Dt] <= '05/31/2014' AND [Total_Pmt_Amt] > '0' THEN Total_Pmt_Amt End) [MAY],
        SUM(CASE WHEN [Paid_Pmt_Dt] >= '06/01/2014'
        AND[Paid_Pmt_Dt] <= '06/30/2014' AND [Total_Pmt_Amt] > '0' THEN Total_Pmt_Amt End) [JUNE]
    FROM Gross_Pmt
    GROUP BY Number

在某些情况下,两个月中的任何一个都没有付款 - 在这些情况下,我在两个月都看到了NULL。如果两个月都为NULL,有没有办法在不显示记录时发生这种情况?

4 个答案:

答案 0 :(得分:0)

SELECT 
    Number As [ACCOUNT NUMBER],
    SUM(CASE 
        WHEN 
            [Paid_Pmt_Dt] >= '05/01/2014' AND
            [Paid_Pmt_Dt] <= '05/31/2014' AND 
            [Total_Pmt_Amt] > '0' 
        THEN Total_Pmt_Amt 
        END) [MAY],
    SUM(CASE 
        WHEN 
            [Paid_Pmt_Dt] >= '06/01/2014' AND
            [Paid_Pmt_Dt] <= '06/30/2014' AND 
            [Total_Pmt_Amt] > '0' 
        THEN Total_Pmt_Amt 
        END) [JUNE]
FROM Gross_Pmt
WHERE Paid_Pmt_Dt >= '05/01/2014' AND Paid_Pmt_Dt <= '6/30/2014'
GROUP BY Number

答案 1 :(得分:0)

有三种方法可以解决这个问题:

  1. 添加WHERE子句以仅过滤两个月内的日期
  2. 添加HAVING子句以过滤非空的
  3. 将查询包装为内部查询,并在SUM结果列上使用WHERE子句指定它们不是空的
  4. 选项1.更有效,更容易编码。将此WHERE子句添加到查询中:

    ...
    FROM ...
    WHERE Paid_Pmt_Dt BETWEEN '05/01/2014' AND '06/30/2014'
    GROUP BY ...
    

答案 2 :(得分:0)

将月份和年份添加到group by子句

SELECT Number [ACCOUNT NUMBER],YEAR([Paid_Dmt_Dt]) YYYY,MONTH([Paid_Dmt_Dt]) MM,SUM(Total_Pmt_Amt) GrossTotal
FROM Gross_Pmt 
GROUP BY Number, YEAR([Paid_Dmt_Dt]),MONTH([Paid_Dmt_Dt])

默认情况下,这会消除空月。您也不需要[Total_Pmt_Amt] > '0'

这将每个月返回一行,但我认为您可以将此作为PIVOT的基础或使用此解决方案。

答案 3 :(得分:0)

如果我理解正确,你只想过滤两个计算列都返回NULL的行:

SELECT * 
FROM
  (

    SELECT 
        Number As [ACCOUNT NUMBER],
        SUM(CASE WHEN [Paid_Pmt_Dt] >= '05/01/2014'
        AND[Paid_Pmt_Dt] <= '05/31/2014' AND [Total_Pmt_Amt] > '0' THEN Total_Pmt_Amt End) [MAY],
        SUM(CASE WHEN [Paid_Pmt_Dt] >= '06/01/2014'
        AND[Paid_Pmt_Dt] <= '06/30/2014' AND [Total_Pmt_Amt] > '0' THEN Total_Pmt_Amt End) 
    FROM Gross_Pmt
    GROUP BY Number
  ) as dt
WHERE [MAY] IS NOT NULL OR [JUNE] IS NOT NULL