SQL Over partition by

时间:2017-09-12 15:04:28

标签: sql sql-server where

我基本上有一个案例陈述,显示每个人的利润总和和一个月的总和。我的想法是,我想要显示该人的每日数字以及他们整个月的总数。

我的问题是当我将结果限制在昨天(假设是每日数字)时,这会影响月值的计算(只计算当天的总和而不是整个月)。

这是因为月份总值超出了查询的范围。无论如何都要正确计算每个人的整月值,而没有影响结果的界限。

e.g。 结果:

08/09/17:    25    
09/09/17:    25   
10/09/17:    25    
11/09/17:    25  <<<< but only display one day and month total
Overall Month total: 100 

这也可以包含空值吗?我想我几乎看到一个动态存储的月份到期值不受where子句的影响。

SELECT SUM(Figure) AS 'Daily Figure',

CASE WHEN 
    MONTH([DATE]) = MONTH(getdate()) AND
        YEAR([DATE]) = YEAR(getdate())
THEN  
SUM(Figure)
OVER (PARTITION BY [Name], 
MONTH([DATE])) 
ELSE 0 END 
as [Month To Date Total]

WHERE 
    dateadd(day,datediff(day,1,GETDATE()),0)

1 个答案:

答案 0 :(得分:1)

如果您想要按月更新和当前金额,请使用条件汇总:

SELECT NAME,
       SUM(CASE WHEN DAY(DATE) = DAY(GETDATE()) - 1 THEN Figure ELSE 0 END) AS DailyFigure,  
       SUM(Figure) as MonthToDate      
WHERE MONTH([DATE]) = MONTH(getdate()) AND
      YEAR([DATE]) = YEAR(getdate())
GROUP BY NAME;

除了本月的第一天之外,其他所有内容都适用。