【问题标题】:Selecting data for a span of multiple weeks选择多周的数据
【发布时间】:2018-10-31 10:13:02
【问题描述】:

我有两张这样的表

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

【问题讨论】:

  • 什么决定了ReportingWeek
  • @TabAlleman 查看编辑
  • 所以报告周不是基于一周中的某一天?无论@FromDateTime 是什么,无论是星期几?
  • 来吧 - 格式
  • 你真的应该在这里使用连接而不是子查询。为了提供足够的帮助,尽管我们需要一些更清晰的信息。这是一个很好的起点。 spaghettidba.com/2015/04/24/…

标签: sql sql-server tsql reporting-services


【解决方案1】:

我最喜欢的方法是创建一个“日期维度”表,它实际上只是一个日期列表,但每个日期条目都会存储附加信息:例如:

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 加上 YearWeekNumber 来为用户提供周的下拉列表。这样,日期将存储在一个地方,因此您无需每次都在查询中重新生成它们。您甚至可以调整 DateDimension 表以包含您需要的字段,例如 [YYYYWW](2018 年第 4 周为 201804)。

您可以在强大的互联网上找到用于生成 datedim 表的脚本,但请确保获得一个适用于您的 SQL 版本的脚本。这是我过去使用过的一个:

http://www.sqlservercentral.com/scripts/Data+Warehousing/156805/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多