2010-02-11 6 views
2

У меня была охота вокруг чего-то подобного, но ничего не найти.Получение календарного месяца с недели

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

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

Например:

ОБЪЕМ ---- TRANSACTION ---- YEAR ---- МЕСЯЦА ---- НЕДЕЛИ

1264,1730 ---- 53 ---- 2009 --- -September ---- 37
2739,7200 --- 109 ---- 2009 ---- September ---- 38
522,5500 ----- 21 ---- 2009 ---- October- --- 39
1196,6450 ---- 51 ---- 2009 ---- сентябрь ---- 39

2827,9550 --- 113 ---- 2009 ---- October ---- 40
2730.4050 --- 110 ---- 2009 ---- October ---- 41
3763,7200 --- 154 ---- 2009 ---- October ---- 42
3425,6250 --- 137 ---- 2009 ---- October ---- 43
3551,8100 --- 143 ---- 2009 ---- November - 44
2788.0150 --- 113 ---- 2009 --- -November - 45

ответ

1

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

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

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

SELECT year, MIN(month), week, SUM(transaction) 
FROM Table1 
GROUP BY year, week 
+0

и простой мин (месяц) или еще что-то. – Tanzelax

+0

Спасибо, ребята Mark - в настоящее время используется, что Tanzelax - Crude, но он работает на данный момент ... – 2010-02-11 02:55:14

+0

@Tanzelax: Добавлено, спасибо. –

0

Что-то, как это будет делать:

-- 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 
Смежные вопросы