【问题标题】:NULL being returned on a Cumulative Sum SQL在累积和 SQL 上返回 NULL
【发布时间】:2015-05-11 08:13:39
【问题描述】:

我有一张个人销售额表,我想将其汇总为两列,其中一列是每月总计,另一列是累计总和。

select Year, Month, 'Acquisition Income' = SUM(PAYMENTAMOUNT), 
        'Acquisition Cumulative' = (select SUM(PAYMENTAMOUNT)
                                        from #CampaignPayments b
                                        where (a.Year >= b.Year and a.Month >= b.Month)
                                        or (a.Year > b.Year) ) 
into #CampaignTotals
from #CampaignPayments a
group by YEAR, MONTH
order by YEAR asc, MONTH asc

但是,我遇到了一些麻烦,有几个月没有付款,因此我那个月的“购置收入”是NULL

Year    Month   Acquisition Income  Acquisition Cumulative
2013    5       121782               121782
2013    6       25959.2              147741.2
2013    7       2875                 150616.2
2013    8       1995                 152611.2
2013    9       625                  153236.2
2013    10      590                  153826.2
2013    11      935                  154761.2
2013    12      550                  155311.2
2014    1       777                  156088.2
2014    2       210                  156298.2
2014    3       75                   156373.2
2014    4       520                  156893.2
2014    5       150                  157043.2
2014    6       340                  157383.2
2014    7       NULL                 NULL
2014    8       30                   157413.2

我该怎么做

(a):在“购置收入”列中返回0 而不是NULL(我尝试过coalesce(SUM(paymentamount),0)isnull,但都不起作用。)

(b):继续计算“累积获取”列,即使当月没有付款? (即总和与上个月相同)

老实说,我并不完全理解累积金额的工作原理 - 在我看来,每行返回时,它应该汇总所有符合 where/or 子句标准的付款,所以我不确定为什么当月没有付款会影响前几个月的总和?

非常感谢。

【问题讨论】:

  • 也许SUM(ISNULL(PAYMENTAMOUNT, 0)) 能帮上忙?
  • 并不是说它会对您的问题产生任何影响,但我认为第一个条件最好表述为a.Year = b.Year and a.Month >= b.Month。在任何情况下,合并总和都无济于事,因为任何空值都会导致您丢失整个月的信息。我认为您最好使用汇总合并值之类的方法:sum(coalesce(paymentamount,0))
  • @paxdiablo - 没用。我没想到会。我认为那个月没有任何付款是有问题的。
  • @IvanSivak - 不幸的是也不起作用......
  • 如果该月没有付款,那么select 肯定不会返回一行,而是返回一个空行?

标签: sql sql-server database tsql


【解决方案1】:
Here you go

SELECT  [Year], 
       [Month],  
       [Acquisition Income], 
       SUM([Acquisition Income]) OVER( ORDER BY [Year], [Month]
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS [Acquisition Cumulative]
INTO #CampaignTotals
FROM
    (

    SELECT Year, Month, ISNULL(SUM(PAYMENTAMOUNT), 0) AS 'Acquisition Income'          
    FROM #CampaignPayments a
    GROUP BY YEAR, MONTH    
    ) AS OuterSet

【讨论】:

  • 您不需要子查询,但我认为这是正确的(假设他们使用不太旧的 SQL-Server 版本)。
  • 我没有使用子查询,它是一个派生表表达式:)
  • 是的,我指的是派生表。
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多