вывод календарного месяца из номера недели - PullRequest
2 голосов
/ 11 февраля 2010

Я охотился за чем-то похожим на это, но ничего не могу найти.

У меня есть запрос, который предоставляет количество транзакций, которые произошли каждый день, и мне нужно сгруппировать их по году, месяцу, неделе, НО, конечно, некоторые месяцы охватывают несколько номеров недели, например. Сентябрь и октябрь 2009 года.

Возьмите, например, неделю 39 в прошлом году (сентябрь и октябрь). Четверг - 1 октября, поэтому 4 дня этой недели приходятся на октябрь, поэтому к первой неделе октября следует добавить объем транзакций за последние 3 дня сентября? Очистить

Например:

ОБЪЕМ ---- TRANSACTION ---- YEAR ---- МЕСЯЦ ---- Неделя

1264.1730 ---- 53 ---- 2009 ---- Сентябрь ---- 37
2739.7200 --- 109 ---- 2009 ---- Сентябрь ---- 38
522,5500 ----- 21 ---- 2009 ---- Октябрь ---- 39
1196,6450 ---- 51 ---- 2009 ---- Сентябрь 39

2827,9550 --- 113 ---- 2009 ---- октябрь ---- 40
2730.4050 --- 110 ---- 2009 ---- Октябрь ---- 41
3763.7200 --- 154 ---- 2009 ---- Октябрь ---- 42
3425.6250 --- 137 ---- 2009 ---- Октябрь ---- 43
3551,8100 --- 143 ---- 2009 ---- ноябрь - 44
2788.0150 --- 113 ---- 2009 ---- Ноябрь - 45

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Проблема в том, что календарь неуклюжий, и вы ничего не можете с этим поделать. Насколько я вижу, у вас есть три варианта:

  1. Группировка по годам и месяцам. Показать неделю или недели в результате, но не группировать по ним.
  2. Группировка по годам и неделям. Показать месяц или месяцы в результате, но не группировать по ним.
  3. Группируйте по годам, месяцам, неделям и принимайте, что некоторые группы содержат данные менее чем за одну неделю. (то есть, что у вас есть сейчас)

Из вашего описания кажется, что вы хотите вариант 2:

SELECT year, MIN(month), week, SUM(transaction)
FROM Table1
GROUP BY year, week
0 голосов
/ 12 февраля 2010

Примерно так:

-- For weeks starting Sunday and ending Saturday, the US default:
SET DATEFIRST 7 

-- Alternatively, for weeks starting Saturday and ending Friday:
--SET DATEFIRST 6 

SELECT 
  [Date]
, DATENAME(WEEKDAY,[Date]) AS [DayOfWeek]
, DATEADD(DAY,1-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekStarting
, DATEADD(DAY,7-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekEnding
FROM (
  SELECT CONVERT(DATETIME,'20100124') UNION ALL
  SELECT CONVERT(DATETIME,'20100125') UNION ALL
  SELECT CONVERT(DATETIME,'20100126') UNION ALL
  SELECT CONVERT(DATETIME,'20100127') UNION ALL
  SELECT CONVERT(DATETIME,'20100128') UNION ALL
  SELECT CONVERT(DATETIME,'20100129') UNION ALL
  SELECT CONVERT(DATETIME,'20100130') UNION ALL
  SELECT CONVERT(DATETIME,'20100131') UNION ALL
  SELECT CONVERT(DATETIME,'20100201') UNION ALL
  SELECT CONVERT(DATETIME,'20100202') UNION ALL
  SELECT CONVERT(DATETIME,'20100203') UNION ALL
  SELECT CONVERT(DATETIME,'20100204') UNION ALL
  SELECT CONVERT(DATETIME,'20100205') UNION ALL
  SELECT CONVERT(DATETIME,'20100206')
) a ([Date])

Затем преобразуйте дату начала или окончания недели в месяц:

SELECT *
, WeekStartingMonthStart = DATEADD(DAY,1-DAY(WeekStarting),WeekStarting)
, WeekStartingMonthEnd   = DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(WeekStarting),WeekStarting)))
, WeekEndingMonthStart   = DATEADD(DAY,1-DAY(WeekEnding),WeekEnding)
, WeekEndingMonthEnd     = DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(WeekEnding),WeekEnding)))
FROM (
  SELECT 
    [Date]
  , DATENAME(WEEKDAY,[Date]) AS [DayOfWeek]
  , DATEADD(DAY,1-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekStarting
  , DATEADD(DAY,7-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekEnding
  FROM (
    SELECT CONVERT(DATETIME,'20100124') UNION ALL
    SELECT CONVERT(DATETIME,'20100125') UNION ALL
    SELECT CONVERT(DATETIME,'20100126') UNION ALL
    SELECT CONVERT(DATETIME,'20100127') UNION ALL
    SELECT CONVERT(DATETIME,'20100128') UNION ALL
    SELECT CONVERT(DATETIME,'20100129') UNION ALL
    SELECT CONVERT(DATETIME,'20100130') UNION ALL
    SELECT CONVERT(DATETIME,'20100131') UNION ALL
    SELECT CONVERT(DATETIME,'20100201') UNION ALL
    SELECT CONVERT(DATETIME,'20100202') UNION ALL
    SELECT CONVERT(DATETIME,'20100203') UNION ALL
    SELECT CONVERT(DATETIME,'20100204') UNION ALL
    SELECT CONVERT(DATETIME,'20100205') UNION ALL
    SELECT CONVERT(DATETIME,'20100206')
  ) a ([Date])
) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...