2015-07-08 2 views
1

У меня есть sproc, который в основном:SQL run Variable +1 до тех пор, пока переменная не достигнет 52?

declare @StartDate date 
declare @EndDate date 
declare @WeekNumber int 

set @StartDate = '01/06/2014' 
set @EndDate = '07/06/2015' 
set @WeekNumber = 01 

select @WeekNumber [WeekNumber] 
,dateadd(ww,(@WeekNumber-1),@startDate) [WeekStartDate] 
,dateadd(dd,6,dateadd(ww,(@WeekNumber-1),@startDate)) [WeekEndDate] 
,* 
From (Select t1.LeadSource 
        ,count(t1.prospectid) [Leads] 
        ,sum(t1.Found) [Apps] 
     from Table T1 
     where t1.CreateDate between dateadd(ww,(@WeekNumber-1),@startDate) 
      and cast(convert(varchar(10),dateadd(dd,6,dateadd(ww,(@WeekNumber-1),@startDate)),101) as datetime)) f 
GROUP BY f.LeadSource 

Это будет, как это выглядит, когда он возвращается

WeekNumber WeekStartDate WeekEndDate Leads Apps 
1   2014-01-06  2014-01-12 30  3  

мне нужно запустить это в течение последних 2-х лет, с ним на велосипеде через каждую неделю и возвращать его по номеру недели, если это имеет смысл.

Есть ли способ прокрутить переменную @WeekNumber Variable и остановить ее, когда она достигнет 52 недель или даже 104?

Спасибо за ваше время.

+0

Обычный способ для этого типа - перекрестное соединение с таблицей вспомогательных номеров или таблицей таллинга. –

+0

Видел это до конца ... Я просто добавил ответ с предложением создать таблицу чисел «на лету» ... – Shnugo

ответ

2

Если вы думаете о циклах, вы идете по неверному пути. Вам нужно думать в терминах логики, основанной на множестве. Что вам нужно сделать, так это избавиться от переменной @weeknumber и просто группировать данные по-разному. Вы хотите группировать по неделям, поэтому вам нужно рассчитать номер недели. Вы можете сделать это с помощью DATEDIFF() и DATEPART (с.в., ...):

declare @StartDate date 
declare @EndDate date 
declare @WeekNumber int 

set @StartDate = '01/06/2014' 
set @EndDate = '07/06/2015' 
--set @WeekNumber = 01 

select datediff(ww,@startdate,[WeekStartDate])+1 [WeekNumber] 
,[WeekStartDate] 
,dateadd(dd,6,[WeekStartDate]) [WeekEndDate] 
,* 
From (Select t1.LeadSource 
        ,count(t1.prospectid) [Leads] 
        ,sum(t1.Found) [Apps] 
        ,dateadd(dd,2-datepart(dw,t1.CreateDate),t1.CreateDate) WeekStartDate 
     from Table T1 
     where t1.CreateDate between @startDate 
      and @enddate 
GROUP BY f.LeadSource) f 
+0

Я вижу, что вы здесь говорите, но я не на нем 100%. в частности синтаксис вокруг [WeekStartDate]. Я пытаюсь работать с ним сейчас, хотя, спасибо за ваше время – user1949329

+0

Я делаю 2 вещи. Сначала я получаю datepart (dw, t1.createdate). Это дает мне день недели (1, 2, 3, 4, 5, 6 или 7). Я принимаю это как отличие от 2. Так что если это среда (4 день), то 2-4 = -2. Затем я использую dateadd, чтобы изменить дату на столько, всегда вернув нас в понедельник. Если вы используете 1-, а не 2-, вы получите воскресенье. –

+0

попробуйте это в SQL Server: выберите getdate() Сегодня datepart (dw, getdate()) weekdayOfToday, dateadd (dd, 2-datepart (dw, getdate()), getdate()) ThisMonday –

0

Один забавный способ может быть что-то вроде этого:

Я использую такую ​​функцию в моей БД для генерации работает множество чисел, когда мне это нужно ...

CREATE FUNCTION dbo.RunningNumber(@Counter AS INT) 
RETURNS TABLE 
AS 
RETURN 
SELECT TOP (@Counter) ROW_NUMBER() OVER(ORDER BY o.object_id) AS RunningNummber 
FROM sys.objects AS o; --take any large table here... 
GO 
SELECT * FROM dbo.RunningNumber(100) 

Убедитесь использовать @Counter, которое не выше, чем количество строк таблицы, которую вы используете. Вы можете подключиться к данному SELECT, а затем использовать Modulo 7 (% 7) для вашей группировки ...