【问题标题】:SQL GROUP BY aliasSQL GROUP BY 别名
【发布时间】:2016-06-24 13:58:54
【问题描述】:

我有一个用于表示时间的 smallint 列。我编写了以下代码来根据时间得出结果:

        CASE
    WHEN 
        CONVERT(varchar, t0.U_ORC_BE_ProdTime, 108) BETWEEN '07:00:00' AND '19:00:00' THEN '1'
    ELSE '2'
END  AS [Shift],
    --If time is between 7am and 7pm then Shift 1, else Shift 2

我想将它插入到我已有的查询中,然后按班次分组。

    SELECT 

T6.U_ORC_BE_StyleName AS [Style Name],
T0.[ItemCode],
STUFF(T0.[ItemCode], 1, 6, '') AS [Shortened ItemCode],
SUM(T0.[PlannedQty]) AS [Planned Qty],
SUM(T0.CmpltQty) AS [Actual Qty], 
SUM(T0.CmpltQty) - SUM(T0.PlannedQty) AS [Qty Difference],
SUM(T5.U_ORC_BE_HECTOLITER * T0.CmpltQty) AS [Total Hectoliters],

CASE
    WHEN [.......]
    THEN
    WHEN [.......]
    THEN
END AS [Line],

T0.U_ORC_BE_ProdDate AS [Date Produced]

    FROM [.......]

    GROUP BY T6.U_ORC_BE_StyleName, T0.[ItemCode], T5.Code , T0.U_ORC_BE_ProdDate

它不断抛出一个错误,但我怀疑这是由于尝试按别名进行分组。

“每个 GROUP BY 表达式必须包含至少一列不是外部引用。”

【问题讨论】:

  • 抛出的错误是什么?
  • 抱歉,我已编辑问题以包含错误。
  • 哪里是 T0.U_ORC_BE_ProdDate 在 select ,如果你没有选择它然后从 Group by 中删除

标签: sql group-by sql-server-2016


【解决方案1】:

要像 case 语句一样按计算列分组,您还必须将该语句包含在 group by 中。例如:

SELECT
  CASE ... END AS CaseStatement,
  [YourColumns]
FROM YourTable
GROUP BY CASE ... END

【讨论】:

  • 看起来很明显!非常感谢。
【解决方案2】:

如错误所述,您不能按别名进行分组。在您的分组之后,您将不得不复制整个案例。

 select 
 ....
 group by 
 T6.U_ORC_BE_StyleName, T0.[ItemCode], T5.Code , T0.U_ORC_BE_ProdDate,
 CASE
    WHEN [.......]
    THEN
    WHEN [.......]
    THEN
END 

【讨论】:

  • 当这样给我时,它更有意义。感谢您的帮助。
猜你喜欢
  • 2011-04-19
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多