2012-07-02 3 views
0

Я начинаю с SQL, создавая хранимую процедуру с целью определения заданного интервала времени и интервала и возвращаю данные в пределах этого временного диапазона, сгруппированного по интервалу. Например, ввод двухнедельного интервала времени и 2-дневного интервала даст 7 точек данных производительности.Использование DatePart внутри оператора case switch

Для создания групп я использую корпус коммутатора для единицы интервала и datepart, чтобы извлечь ее для группировки. Однако моя процедура не будет компилироваться. Вот мой код:

declare @interval int 
declare @unit varchar(6) 

set @interval=1 
set @unit='year' 

select 
    case @unit 
     when 'year' then datepart(year, CreateDate)/@interval*@interval 
     when 'month' then datepart(month, CreateDate)/@interval*@interval 
     when 'week' then datepart(week, CreateDate)/@interval*@interval 
     when 'day' then datepart(day, CreateDate)/@interval*@interval 
     when 'hour' then datepart(hour, CreateDate)/@interval*@interval 
     when 'minute' then datepart(minute, CreateDate)/@interval*@interval 
     when 'second' then datepart(second, CreateDate)/@interval*@interval 
    end 
from OrderInfoCustom 
group by 
    case @unit 
     when 'year' then datepart(year, CreateDate)/@interval 
     when 'month' then datepart(month, CreateDate)/@interval 
     when 'week' then datepart(week, CreateDate)/@interval 
     when 'day' then datepart(day, CreateDate)/@interval 
     when 'hour' then datepart(hour, CreateDate)/@interval 
     when 'minute' then datepart(minute, CreateDate)/@interval 
     when 'second' then datepart(second, CreateDate)/@interval 
    end 

Это отказывается компилировать, давая эту ошибку (несколько раз):

Msg 8120, уровень 16, состояние 1, строка 7 Колонка 'OrderInfoCustom.CreateDate' является недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY .

Похоже, что компилятор не признает, что CreateDate является частью агрегатной функции, поскольку он находится в коммутационном футляре? Я не уверен.

EDIT: Я должен включать в себя я на Microsoft SQL Server 2005.

ответ

1

Да, вы группируя выражением, так что вы не можете использовать часть этого выражения в выборе.

Если вы используете точно такое же выражение, оно должно работать:

select 
    case @unit 
    when 'year' then datepart(year, CreateDate)/@interval 
    when 'month' then datepart(month, CreateDate)/@interval 
    when 'week' then datepart(week, CreateDate)/@interval 
    when 'day' then datepart(day, CreateDate)/@interval 
    when 'hour' then datepart(hour, CreateDate)/@interval 
    when 'minute' then datepart(minute, CreateDate)/@interval 
    when 'second' then datepart(second, CreateDate)/@interval 
    end * @interval 
from OrderInfoCustom 
group by 
    case @unit 
    when 'year' then datepart(year, CreateDate)/@interval 
    when 'month' then datepart(month, CreateDate)/@interval 
    when 'week' then datepart(week, CreateDate)/@interval 
    when 'day' then datepart(day, CreateDate)/@interval 
    when 'hour' then datepart(hour, CreateDate)/@interval 
    when 'minute' then datepart(minute, CreateDate)/@interval 
    when 'second' then datepart(second, CreateDate)/@interval 
    end 

Вы также можете использовать подзапрос:

select y * @interval 
from (
    select 
    case @unit 
     when 'year' then datepart(year, CreateDate)/@interval 
     when 'month' then datepart(month, CreateDate)/@interval 
     when 'week' then datepart(week, CreateDate)/@interval 
     when 'day' then datepart(day, CreateDate)/@interval 
     when 'hour' then datepart(hour, CreateDate)/@interval 
     when 'minute' then datepart(minute, CreateDate)/@interval 
     when 'second' then datepart(second, CreateDate)/@interval 
    end as y 
    from OrderInfoCustom 
) x 
group by y 
+0

Ах, да. Извините за глупые вопросы. Спасибо, ваша помощь была высоко оценена. – disambiguator

Смежные вопросы