简体   繁体   中英

SQL Over partition by

I basically have a case statement that displays the sum of profit and a month to date total for each person. My idea is i want to display a daily figure of that person as well as their whole month total altogether.

My issue is when i limit results to just yesterday (supposed to be a daily figure) this then effects the calculation of the month value (just calculates the sum for that day rather than the whole month).

This is because the total month values are all out of the scope of the query. Is there anyway to calculate the whole month value for each person correctly without having the limits of where effecting the result.

eg The result:

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 

Can this also includes nulls too? I think im almost looking at a dynamically stored month to date value that isn't effected by where clauses.

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)

If you want month-to-date and the current amount, then use conditional aggregation:

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;

This works on all but the first day of the month.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM