Как создать список недель, соответствующих месяцу в SQL? - PullRequest
1 голос
/ 01 ноября 2011

Мне нужно создать отчет, который выглядит следующим образом («МЫ» - выходной с воскресенья по субботу):

SEPT.           
            WE 9/10     WE 9/17     WE 9/24     WE 10/1
Metric#1    40          49          58          40
Metric#2    24          25          20          1

Выше может быть не правильно, это просто пример формата.

Моя проблема в том, что я не знаю, какие недели соответствуют каким месяцам. Например, с 30 октября по 5 ноября я не знаю, к какому месяцу он относится.

Они дали мне гибкость в том, как это сделать. Пока это соответствует, это должно быть хорошо.

Я также мог бы использовать месяц воскресенья этой недели (октябрь 30 ноября-5 был бы октябрьской неделей, потому что 30 октября - воскресенье).

Здесь можно воспользоваться некоторой помощью, чтобы выяснить, как назначить неделю определенному месяцу. Я могу сделать поворот, это логика даты, в которой я не уверен. Отчет за последние 3 месяца.

SQL Server 2008. Отчет будет в SSRS 2008 R2

edit : Только что получил требования от клиента. Месяц с наибольшим количеством дней на этой неделе. Например, 28 августа - 3 сентября, для этой недели в августе 4 дня, а в сентябре 3 дня, поэтому эта неделя относится к августу. Я посмотрю, смогу ли я решить это.

Ответы [ 3 ]

2 голосов
/ 01 ноября 2011

Ваше дополнительное требование означает, что месяц недели всегда будет месяцем недели недели (поскольку у вас есть недели Sun-Sat.):

DECLARE @TestDate DATETIME

SET @TestDate = 'October 31, 2011'

SELECT 
   DATEADD(week, DATEDIFF(week, 0, @TestDate), 2) AS WednesdayOfWeek, -- This is Wednesday of the week.
   DATEPART(MONTH, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)) AS MonthNum,
   DATENAME(MONTH, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)) AS MonthName,
   DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)), 0) AS FirstOfMonth
2 голосов
/ 01 ноября 2011

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

WITH marked AS (
  SELECT
    *,
    WednesdayDate = DATEADD(DAY, 4 - DATEPART(WEEKDAY, DateColumn), DateColumn)
  FROM atable
),
grouped AS (
  SELECT
    WeekYear   = YEAR(WednesdayDate),
    WeekMonth  = MONTH(WednesdayDate),
    WeekEnding = DATEADD(DAY, 3, WednesdayDate),
    Metric1    = AGG(...),
    Metric2    = AGG(...),
    ...
  FROM marked
  GROUP BY WednesdayDate
)
SELECT *
FROM grouped
WHERE WeekYear  = ...
  AND WeekMonth = ...

Ваш следующий шаг, вероятно, будет динамическое вращение .

2 голосов
/ 01 ноября 2011

Подобную проблему лучше всего решить с помощью календарной таблицы: http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

По сути, вы строите таблицу дней (10 лет дней - это всего 3652 строки), и вы связываете каждую дату с неделей, которую хотите назначить.

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