选择数周的数据

时间:2018-05-21 17:51:25

标签: sql sql-server tsql reporting-services

我有两个看起来像这样的表

_____________________
| 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循环,但我听说这不是最佳实践。

1 个答案:

答案 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/