2013-08-02 41 views
1

我試圖讓一個聚合函數和case語句的查詢工作在我的select和一組通過case語句在SQL Server 2005中工作,但我似乎失蹤一些東西。由案例陳述的結果組

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'.

看來這個case語句是錯誤的根本原因,但我不應該寫一個子查詢或加入只是爲了得到這個工作。有任何想法嗎?

回答

0

不能引用別名在GROUP BY,所以乾脆把整個case語句在裏面。關閉「as timetripe」部分。

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是:

  • FROM,
  • WHERE
  • GROUP BY和
  • SELECT。

由於SELECT來自後GROUP BYSELECT條款(包括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。 –