1

我试图让一个带有聚合函数和 case 语句的查询在我的 select 和 case 语句上的 group by 中工作,以便在 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(*)部分有点弱,但问题在于 group by 语句。当我运行此查询时,我收到以下错误:

消息 207,第 16 级,状态 1,第 15 行
无效的列名称“timestripe”。

似乎 case 语句是错误的根本原因,但我不应该仅仅为了让它工作而编写子查询或加入。有任何想法吗?

4

2 回答 2

0

对于该查询,SELECT 语句的逻辑处理顺序为:

  • 从,
  • 在哪里
  • 分组依据和
  • 选择。

因为SELECT在子句(包括)中GROUP BY定义的所有别名都不能在上一步()中使用之后。SELECTtimestripeGROUP 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
于 2013-08-02T17:43:04.680 回答
0

您不能在 GROUP BY 中引用别名,因此只需将整个 case 语句放入其中。将“as 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
于 2013-08-04T00:27:04.420 回答