【问题标题】:Invalid column name error when adding to Group By添加到 Group By 时出现无效的列名错误
【发布时间】:2018-08-20 02:20:36
【问题描述】:

我的 Select 语句中有这个,需要添加到我的 GROUP BY

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

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

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

【问题讨论】:

  • 您是否显示了查询的第 27 行?

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Select 语句实际上从 FROM 子句开始处理,并以语句的 SELECT 部分结束。这意味着从 FROM 开始读取查询,然后是 GROUP BY,然后是 WHERE...,最后读取 SELECT。这意味着 GROUP BY 只能引用 FROM 子句中存在的列。因此,您会收到错误消息“Msg 207, Level 16, State 1, Line 27 Invalid column name 'mQuarter',因为 'mQuarter' 直到您的 SELECT 语句才存在。 因此,基本上,您还必须在 GROUP BY 中重现您的“mQuarter”列才能使其正常工作。

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

    【讨论】:

    • 在 Group by 中添加了整列并得到此错误,“消息 164,级别 15,状态 1,第 27 行每个 GROUP BY 表达式必须包含至少一列不是外部引用。 "
    • @Camille 你需要给我们完整的查询文本
    • 正如编辑所示 - 这是一个不变的表达式,所以根本不需要按它分组。对于每一行,它将具有相同的值。除非 getdate() 只是用作示例,它实际上是指一个列。
    【解决方案3】:

    使用括号。然而,这可以通过去掉一些演员来简化:

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

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

    【讨论】:

    • 更改为此代码时仍然出现相同的错误。
    • @卡米尔。 . .我认为这段代码不会导致您的语法错误。您应该查看其余代码。
    • 不要认为括号有任何区别。任何人都没有不同?
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多