2013-08-02 4 views
1

Я пытаюсь получить запрос с агрегированной функцией и оператором case для работы в моей группе выбора и группе по оператору case для работы в SQL Server 2005, но, похоже, мне не хватает что нибудь.Группа по результату case case

declare @td int 
set @td = 20130731 

select 
    count(*) as total, 
    case 
     when dateadd(s, cdm.[StartTime], '19700101') >= '2013-07-31 00:00:00.000' and dateadd(s, cdm.[StartTime], '19700101') < '2013-07-31 01:00:00.000' 
     then '0-1' 
    end as timestripe 
FROM 
    [EXTERNAL_CDR].[dbo].[CDRMAIN] as cdm 
WHERE 
    cdm.LocalDay = @td 
    AND cdm.targetnum IN ('500','600') 
GROUP BY 
    timestripe 

count(*) часть слабоват, я знаю, но проблема с группой по заявлению. Когда я запускаю этот запрос, я получаю следующее сообщение об ошибке:

Msg 207, Level 16, State 1, Line 15
Invalid column name 'timestripe'.

Кажется, что сазе является основной причиной ошибки, но я не должен писать подзапрос или присоединиться только, чтобы получить эту работу , Есть идеи?

ответ

0

Вы не можете ссылаться на псевдоним в GROUP BY, так просто поставить все заявление дела в нем. Оставьте часть «как timestripe» частью.

declare @td int 
set @td = 20130731 

select 
    count(*) as total, 
    case 
     when dateadd(s, cdm.[StartTime], '19700101') >= '2013-07-31 00:00:00.000' and dateadd(s, cdm.[StartTime], '19700101') < '2013-07-31 01:00:00.000' 
     then '0-1' 
    end as timestripe 
FROM 
    [EXTERNAL_CDR].[dbo].[CDRMAIN] as cdm 
WHERE 
    cdm.LocalDay = @td 
    AND cdm.targetnum IN ('500','600') 
GROUP BY 
    case 
     when dateadd(s, cdm.[StartTime], '19700101') >= '2013-07-31 00:00:00.000' and dateadd(s, cdm.[StartTime], '19700101') < '2013-07-31 01:00:00.000' 
     then '0-1' 
    end 
0

Для этого запроса logical Processing Order of the SELECT statement является:

  • ОТ,
  • ГДЕ
  • GROUP BY и
  • SELECT.

Поскольку SELECT приходит после GROUP BY всех псевдонимов, определенных в пункте SELECT (включая timestripe) не может быть использован в предыдущей стадии (GROUP BY).

Одним из решений может быть:

SELECT x.timestripe, COUNT(*) AS Cnt 
FROM (
select 
    case 
     when dateadd(s, cdm.[StartTime], '19700101') >= '2013-07-31 00:00:00.000' and dateadd(s, cdm.[StartTime], '19700101') < '2013-07-31 01:00:00.000' 
     then '0-1' 
    end as timestripe 
FROM 
    [EXTERNAL_CDR].[dbo].[CDRMAIN] as cdm 
WHERE 
    cdm.LocalDay = @td 
    AND cdm.targetnum IN ('500','600') 
) x 
GROUP BY x.timestripe 
+0

Этот запрос будет генерировать не более двух строк: один для '0-1' и, возможно, одну строку для' NULL' timestripe. –