2016-09-16 35 views

回答

3

此幫助你,

SELECT [USER], 
     SUM(POINTS) POINTSMONTH, 
     SUM(CASE WHEN CREATEDATE>DATEADD(DAY,-7,GETDATE()) THEN POINTS ELSE 0 END) POINTSWEEK, 
     SUM(CASE WHEN CREATEDATE>DATEADD(DAY,-1,GETDATE()) THEN POINTS ELSE 0 END) POINTSDAY 
    FROM USERS 
    WHERE CREATEDATE> DATEADD(DAY,-30,GETDATE()) 
    GROUP BY [USER] 
+1

這是不正確的:'SUM(點)'總結整個範圍,甚至比那些大一歲。 –

+0

我同意,我提供了通用查詢。所以他可以根據自己的需要進行修改。 –

+0

現在我已根據您的評論更新了答案。 –

2

這應該工作:

WITH Src AS 
(
    SELECT * FROM (VALUES 
    ('user1', 100, DATEADD(DAY,-50,GETDATE())), 
    ('user1', 2, DATEADD(DAY,-15,GETDATE())), 
    ('user1', 3, DATEADD(DAY,-5,GETDATE())), 
    ('user1', 7, GETDATE()), 
    ('user2', 4, GETDATE()) 
    )T([User],Points,CreatedAt) 
) --Test data 

SELECT [User], 
    SUM(Points) Monthly, 
    SUM(CASE WHEN CreatedAt>DATEADD(DAY,-7,GETDATE()) THEN Points ELSE 0 END) Weekly, 
    SUM(CASE WHEN CreatedAt>DATEADD(DAY,-1,GETDATE()) THEN Points ELSE 0 END) Daily 
FROM Src 
WHERE CreatedAt > DATEADD(DAY,-30,GETDATE()) 
GROUP BY [User] 
1

只需使用子查詢讓每一個你需要計算。

select user, 
     (select sum(points) from my_table as points where points.user = users.user and createdAt = getDate()) as pointsDay, 
     (select sum(points) from my_table as points where points.user = users.user and datepart(week, createdAt) = datepart(week, getDate()) and datepart(year, createdAt) = datepart(year, getDate())) as pointsWeek, 
     (select sum(points) from my_table as points where points.user = users.user and datepart(month, createdAt) = datepart(month, getDate()) and datepart(year, createdAt) = datepart(year, getDate())) as pointsMonth, 
from my_table as users 
group by user 
相關問題