2015-03-05 3 views
0

У меня есть следующее, которое отображается по дате. Я хочу группировать каждую неделю, как показано ниже.Как обновить номер недели в SQL?

Select tq.ID, 
     CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate, 
     DATENAME(WEEKDAY,tq.DateCreated)WeekDays, 
     CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial 
    From #temp tq 

Текущие данные:

ID WeekDate    WeekDays WeekSerial WeekNumber 
56 2012-03-01 00:00:00.000 Thursday 4   NULL 
57 2012-03-02 00:00:00.000 Friday  5   NULL 
58 2012-03-03 00:00:00.000 Saturday 6   NULL 
59 2012-03-04 00:00:00.000 Sunday  7   NULL 
62 2012-03-05 00:00:00.000 Monday  1   NULL 
63 2012-03-06 00:00:00.000 Tuesday  2   NULL 
64 2012-03-07 00:00:00.000 Wednesday 3   NULL 
65 2012-03-08 00:00:00.000 Thursday 4   NULL 
67 2012-03-09 00:00:00.000 Friday  5   NULL 
68 2012-03-10 00:00:00.000 Saturday 6   NULL 
69 2012-03-11 00:00:00.000 Sunday  7   NULL 
70 2012-03-12 00:00:00.000 Monday  1   NULL 
71 2012-03-13 00:00:00.000 Tuesday  2   NULL 
73 2012-03-14 00:00:00.000 Wednesday 3   NULL 
74 2012-03-15 00:00:00.000 Thursday 4   NULL 
76 2012-03-16 00:00:00.000 Friday  5   NULL 
77 2012-03-17 00:00:00.000 Saturday 6   NULL 
78 2012-03-18 00:00:00.000 Sunday  7   NULL 

Необходимые данные:

ID WeekDate    WeekDays WeekSerial WeekNumber 
56 2012-03-01 00:00:00.000 Thursday 4   1 
57 2012-03-02 00:00:00.000 Friday  5   1 
58 2012-03-03 00:00:00.000 Saturday 6   1 
59 2012-03-04 00:00:00.000 Sunday  7   1 
62 2012-03-05 00:00:00.000 Monday  1   2 
63 2012-03-06 00:00:00.000 Tuesday  2   2 
64 2012-03-07 00:00:00.000 Wednesday 3   2 
65 2012-03-08 00:00:00.000 Thursday 4   2 
67 2012-03-09 00:00:00.000 Friday  5   2 
68 2012-03-10 00:00:00.000 Saturday 6   2 
69 2012-03-11 00:00:00.000 Sunday  7   2 
70 2012-03-12 00:00:00.000 Monday  1   3 
71 2012-03-13 00:00:00.000 Tuesday  2   3 
73 2012-03-14 00:00:00.000 Wednesday 3   3 
74 2012-03-15 00:00:00.000 Thursday 4   3 
76 2012-03-16 00:00:00.000 Friday  5   3 
77 2012-03-17 00:00:00.000 Saturday 6   3 
78 2012-03-18 00:00:00.000 Sunday  7   3 

Итак, я хочу, чтобы сгруппировать эти значения при НомерНедели, которые должны начинаться с 1 для WeekSerial диапазонов чисел от 1 до 7.

ПРИМЕЧАНИЕ:Неделя начинается с понедельника по воскресенье, поэтому ее пронумерованы от 1 до 7. i.e 1 = понедельник, 2 = вторник и т. Д.!

Update:

INSERT INTO #Temp(KioskCount,KioskAmount,KioskAverage,WeekDate,WeekDays,WeekSerial)  
Select COUNT(tq.quoteid)KioskCount, 
     SUM(tq.PriceQuote) [KioskAmount], 
     SUM(tq.PriceQuote)/COUNT(tq.QuoteID) [KioskAverage], 
     CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate, 
     DATENAME(WEEKDAY,tq.DateCreated)WeekDays, 
     CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial 
from tbl_Quotes tq 
where 
tq.QuoteStatusID <> 12 --remove void transactions 
group by CONVERT(VARCHAR(10),tq.DateCreated,101),DATENAME(WEEKDAY,tq.DateCreated),DATEPART(WEEKDAY,tq.DateCreated)-1 
order by 4 
+0

Вопрос мутноватый, что вы пытаетесь достичь в своей 'оператор INSERT'? –

ответ

0

Неясно на самом деле то, что вы ожидали

Вы уже WeekDate подали я думаю, что дата, является правильной и основано на том, что вы заполнены ваше поле буднего

затем просто вы можете пропустить даты и уточнить номер своей недели с помощью WeekDate

я могу привести пример с этой

DECLARE @DATE DATETIME 
DECLARE @count int 
DECLARE @i int 
SET @i=56// you can find your first id via query too 
SET @count=(select COUNT(WeekDays) from tablename) 
WHILE @i<[email protected] 
BEGIN 

SET @DATE =(select WeekDate from tablename where [email protected]) 
update tablename set WeekNumber=(
SELECT DATEPART(WEEK, @DATE) - 
DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0))+ 1 AS WEEK_OF_MONTH) 
where [email protected] 
set @[email protected] + 1 
END; 

она обновит все ваше поле НомерНедели с соответствующим номером

0

Возможно, это поможет вам:

  1. Прежде всего, необходимо проверить первый из день в вашей базе данных

    SELECT @@DATEFIRST 
    

    По умолчанию SUNDA Y - первый день недели (США). Таким образом, вы должны изменить его на 1 (понедельник)

    SET DATEFIRST 1 
    

    Более Информацию по о SET DATEFIRST

  2. В SQL Server с помощью DATEPART встроенной функции вы можете получить номер недели в году

    SELECT DATAPART(WEEK, WeekDate) 
    

    Также вы можете получить Год выбранной даты-времени

    SELECT DATAPART(YEAR, WeekDate) 
    

    Если запустить эти два запроса для первого ряда (Скажем Неделя номер 1)

    SELECT DATEPART(WEEK, '2012-03-01 00:00:00.000') -- Output = 10 
    SELECT DATEPART(YEAR, '2012-03-01 00:00:00.000') -- Output = 2012 
    

    Но на этой неделе должен быть ваш номер недели 1.

    • Таким образом, вы можете легко вычесть 2012 из вашего года затем умножить его на 52 (потому что у нас есть 52 недель в год)

    • вычитаем 9 из вашего НомерНедели

    • Добавить число, получить сверху

      (YEAR - 2012) * 52 + (WEEK - 9) 
      
  3. Итак, Рунн ИНГ это вы можете получить фактический результат

    SELECT (DATEPART(YEAR, WeekDate) - 2012) * 52 + DATEPART(WEEK, WeekDate) - 9 AS WeekNumber 
    FROM yourTable 
    
Смежные вопросы