【问题标题】:How to group by multiple columns using alias in SQL Server?如何在 SQL Server 中使用别名按多列分组?
【发布时间】:2015-09-29 18:41:44
【问题描述】:

从一些旧代码中获取了一个查询,我正在努力让它工作。每次我提交查询时都会收到错误:

错误代码 207,SQL 状态 S0001:列名“等级”无效

代码:

SELECT 
    COUNT(*) AS PieceCount
    ,shifttimes.shiftid AS ShiftId
    ,specienames.NameText AS Specie
    ,gradenames.NameText AS Grade
    ,DryerNum
    ,CreatedLocal
FROM 
    sheets, shifttimes, Specienames, GradeNames
WHERE 
    sheets.ShiftIndex = shifttimes.ShiftIndex
    AND sheets.SpecieNameIndex = specienames.NameIndex
    AND sheets.gradenameindex = gradenames.NameIndex
    AND CreatedLocal >= '2015-04-01'
    AND CreatedLocal < '2015-06-01'
GROUP BY 
    ShiftId, Grade, DryerNum, Specie

【问题讨论】:

标签: sql sql-server


【解决方案1】:

对于我认为你应该改变的错误

GROUP BY ShiftId
    ,Grade
    ,DryerNum
    ,Specie

GROUP BY shifttimes.shiftid
    ,gradenames.NameText
    ,DryerNum
    ,specienames.NameText

注意:

在您的选择中,您有,CreatedLocal,但在您的group by 中没有,您必须将其从选择中删除或包含在group by

建议:

尝试使用别名和隐式连接(在 from 子句中有两个表)是不推荐使用的语法,建议改用现代的显式语法:

SELECT COUNT(*) AS PieceCount
    ,ST.shiftid AS ShiftId
    ,SN.NameText AS Specie
    ,GN.NameText AS Grade
    ,DryerNum    
FROM 
   sheets S
inner join shifttimes ST
   ON S.ShiftIndex = ST.ShiftIndex
inner join Specienames SN
   ON S.SpecieNameIndex = SN.NameIndex
inner join GradeNames GN
   ON S.gradenameindex = GN.NameIndex
WHERE 
    CreatedLocal >= '2015-04-01'
AND CreatedLocal < '2015-06-01'
GROUP BY 
     ST.shiftid
    ,GN.NameText
    ,DryerNum
    ,SN.NameText

【讨论】:

  • 是的。 GROUP BY 子句不能使用在SELECT 列表中定义的列别名。从逻辑/流程的角度来看,分组发生在选择之前。同样是的,聚合查询的选择列表必须仅列出分组列和/或组的函数(尽管某些数据库允许其他列作为扩展名)。
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多