Выбор данных за несколько недель - PullRequest
0 голосов
/ 21 мая 2018

У меня есть две таблицы, которые выглядят так:

_____________________
| 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

Это уже довольно запутанно и кажется неправильным, но работает и дает мне необходимые данные.Я не знаю, как получить информацию за несколько недель, хотя.Так, чтобы он возвращал что-то подобноев Day1, Day2, Day3 .... будет только для этого «ReportingWeek»

Я думал об использовании цикла while, но я слышал, что это не лучшая практика.

1 Ответ

0 голосов
/ 21 мая 2018

Мой любимый метод - создать таблицу «измерение даты», которая на самом деле представляет собой просто список дат, но с каждой записью даты сохраняется дополнительная информация: например:

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] (201804 для 4-й недели в 2018 году).

Вы можете найти сценарии для создания таблицы датедимов в могущественных интервалах, простоОбязательно получите тот, который работает с вашей версией SQL.Вот тот, который я использовал в прошлом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...