我可以在 1 MS SQL 查询中得到一天、一周和一个月的总和吗?
Can I get the sum of the day, the week and the month in 1 MS SQL query?
当我有一个 table 列时
- 用户
- 分
- 创建时间
是否可以在 1 毫秒 SQL 查询中获取每个用户当天、每周和每月的所有积分?
所以结果看起来像这样:
|user |pointsDay|pointsWeek|pointsMonth|
|user1| 12 | 50 | 200 |
|user2| 10 | 60 | 222 |
...
这应该有效:
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]
只需使用子查询即可获得您需要的每个计算。
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
这对你有帮助,
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]
当我有一个 table 列时
- 用户
- 分
- 创建时间
是否可以在 1 毫秒 SQL 查询中获取每个用户当天、每周和每月的所有积分?
所以结果看起来像这样:
|user |pointsDay|pointsWeek|pointsMonth|
|user1| 12 | 50 | 200 |
|user2| 10 | 60 | 222 |
...
这应该有效:
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]
只需使用子查询即可获得您需要的每个计算。
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
这对你有帮助,
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]