添加到分组依据时,无效的列名称错误

时间:2018-08-20 02:20:37

标签: sql sql-server

我的Select语句中有此内容,需要添加到我的GROUP BY

,cast(year(getdate()) as nvarchar(4))+cast(DATEPART(QUARTER,getdate()) as nvarchar(1))+'Q' mQuarter

当我将mQuarter列添加到Group by时,出现错误:

  

第207层,状态1,第1行,第27行
  无效的列名“ mQuarter”

3 个答案:

答案 0 :(得分:2)

如果您查看Documentation for SELECT statement,您会看到GROUP BY在SELECT语句之前进行了评估,因此您在SELECT中使用别名的任何列在GROUP BY中都不存在。您需要做的就是整件事:

GROUP BY cast(year(getdate()) as nvarchar(4)) +
         cast(DATEPART(QUARTER,getdate()) as nvarchar(1))

答案 1 :(得分:1)

*编辑*

由于您没有引用表中的任何列,因此无需在GROUP BY子句中包含mQuarter。如果将其删除,则不会看到错误;但是,如果看不到查询的其余部分,我不确定它是否会返回您要查找的结果。它将仅在每一行中返回20183Q。


Select语句实际上从FROM子句开始处理,并以语句的SELECT部分​​结束。这意味着查询是从FROM开始读取的,然后是GROUP BY,然后是WHERE ...,最后读取SELECT。这意味着GROUP BY只能引用FROM子句中存在的列。因此,您收到错误消息“消息207,级别16,状态1,行27”无效的列名“ mQuarter”,因为直到您的SELECT语句才存在“ mQuarter”。 因此,从本质上讲,您还必须在GROUP BY中重现“ mQuarter”列,以使其正常工作。

GROUP BY cast(year(getdate())as nvarchar(4))+ cast(DATEPART(QUARTER,getdate())as nvarchar(1))+'Q'

答案 2 :(得分:0)

使用括号。但是,可以通过消除某些强制转换来简化此操作:

( datename(year, getdate()) +
  datename(quarter, getdate()) +
  'Q'
) as mQuarter

datename()是一个方便的函数,因为它返回的是字符串而不是数字。唯一需要注意的是使用month,因为返回了月份名称。