我有两个看起来像这样的表
_____________________
| UserID | UserName | --TableName = User
________________________________________________
| UserID | DateLoggedInOn | MinutesLoggedInFor | ---TableName = SessionInfo
这是一份报告,我应该允许用户选择一个没有限制的日期范围(跨越多周)
目前报告的工作方式是指定一个起始日期,然后报告只会从起始日期开始获取一周的数据。
所以我有一个像这样的查询
Declare @Day1 datetime = @FromDateTime,
@Day2 datetime = DATEADD(DAY,1,@FromDateTime),
@Day3 datetime = DATEADD(DAY,2,@FromDateTime),
@Day4 Datetime = DATEADD(DAY,3,@FromDateTime),
@Day5 datetime = DATEADD(DAY,4,@FromDateTime),
@Day6 datetime = DATEADD(DAY,5,@FromDateTime),
@Day7 datetime = DATEADD(DAY,6,@FromDateTime)
SELECT UserID, username, (select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day1 and si.dateloggedinon <= @Day1 and si.UserID = u.userid) as Day1,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day2 and si.dateloggedinon <= @Day2 and si.UserID = u.userid) as Day2,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day3 and si.dateloggedinon <= @Day3 and si.UserID = u.userid) as Day3,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day4 and si.dateloggedinon <= @Day4 and si.UserID = u.userid) as Day4,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day5 and si.dateloggedinon <= @Day5 and si.UserID = u.userid) as Day5,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day6 and si.dateloggedinon <= @Day6 and si.UserID = u.userid) as Day6,
(select sum(minutesLoggedInfor) from SessionInfo si where si.dateloggedinon >= @Day7 and si.dateloggedinon <= @Day7 and si.UserID = u.userid) as Day7 from User u
这已经非常复杂了,感觉不对,但确实有效并且提供了我需要的数据。 我不知道如何在多周跨度中获取信息。 所以它会返回类似这样的东西
_________________________________________________________
| UserName | UserID | ReportingWeek | Day1 | Day 2 | ……..
| testuser | 5 | 5/13/18 – 5/19/18 | 120 | 240 | …….
| testuser | 5 | 5/20/18 – 5/ 26/18 | 60 | 200 | …….
如果用户设置Reportingweek
, @FromDateTime = 5/13/18
将是一周的跨度
此报告@ToDateTime = 5/26/18
将持续两周,Day1, Day2, Day3
....中的数据仅适用于“ReportingWeek
”
我考虑过使用while循环,但我听说这不是最佳实践。
答案 0 :(得分:0)
我最喜欢的方法是创建一个“日期维度”表,它实际上只是一个日期列表,但是每个日期条目都存储了附加信息:例如:
DateValue: 2035-12-30
YearDayNumber: 364
YearNumber: 2035
WeekDayNumber: 1
DayName: Sunday
YearWeekNumber: 53
一旦你有了那张桌子,你就可以......
JOIN DateDimension d ON d.DateValue = CAST(SessionInfo.DateLoggedInOn AS DATE)
现在,您可以在报告中引用YearNumber Plus YearWeekNumber,为用户提供周数下拉列表。这样,日期存储在一个位置,因此您不需要每次都在查询中重新生成它们。您甚至可以调整DateDimension表以包含您需要的字段,例如[YYYYWW](2018年2018年第4周)。
您可以找到脚本来在强大的互联网上生成一个日期表,只需确保获得一个适用于您的SQL版本的表。这是我过去使用的一个:
http://www.sqlservercentral.com/scripts/Data+Warehousing/156805/