Как зациклить объединение в SQL Server - PullRequest
0 голосов
/ 21 сентября 2011

Я хочу зациклить результат объединения.Это означает, что я объединю данные за квартал (3 месяца).Я использовал WITH, но я точно не знаю об этом (P / s: date - это форматированная строка: 'dd / MM / yyyy', а не datetime).

declare @quarter int;
declare @year int;
declare @i int;
set @quarter = 1;
set @year = 2011;
set @i = 1;

with temp(code, date, value) as 
(select code,date,value from test 
    where convert(int,substring(date,4,2))= @quarter*3+@i 
    and right(date,4)=@year 
    union all 
select code,date,value from test 
    where convert(int,substring(date,4,2))= @quarter*3+@i+1 
    and right(date,4)=@year and from temp where @i <= 3
)
select * from temp;

Пример: в январе было 1 запись.В феврале 2 записи, в марте 3 записи, в апреле 4 записи.В вышеприведенном списке выберите, если я выберу @ квартал = 1, он включает 3 месяца: январь, февраль, март: 6 записей (не включая апрель).

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

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

Но я не понимаю, почему вы не просто используете встроенные функции, которые должны предоставлять вам данные:

SELECT code,date,value from test where
    DATEPART(year,CONVERT(datetime,date,103)) = @year and
    DATEPART(quarter,CONVERT(datetime,date,103)) = @quarter

Формат 103 для функции CONVERT в точности соответствует сохраняемому вами формату, поэтому нет необходимости выполнять какие-либо беспорядочные манипуляции со строками.

0 голосов
/ 21 сентября 2011

Это бы сработало?

declare @quarter int
declare @year int
set @quarter = 1
set @year = 2011

select  code
        ,date
        ,value 
from    test
where   datepart(year, cast(substring(date, 7, 4) + substring(date, 4, 2) + substring(date, 1, 2) as datetime)) = @year
    and datepart(q, cast(substring(date, 7, 4) + substring(date, 4, 2) + substring(date, 1, 2) as datetime)) = @quarter

РЕДАКТИРОВАТЬ:

Хмм ... Просто заметил, что у вас есть не дата, а строка даты.

Ожидайте обновления здесь в ближайшее время ...

EDIT2:

Обновлены даты предложения where для преобразования в реальную дату

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