【问题标题】:Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause列在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中
【发布时间】:2011-07-04 02:26:19
【问题描述】:

我在下面有 sql 查询,但在执行时遇到了问题。

SELECT * from (Select row_number() OVER(Order By FloorUserId) as 'row_number', FloorUserId,
max(CASE WHEN AreaId='[G]' or AreaId=N'L01'  THEN 'X' ELSE ' ' END) as 'L01',
max(CASE WHEN AreaId='[G]' or AreaId=N'L02'  THEN 'X' ELSE ' ' END) as 'L02'
from floor, tbuser where FloorUserId= tbuser.userID  
    )  as derivedTable where row_number BETWEEN 1 AND 20

但我不断收到以下错误:

选择中的“FloorId”列无效 列出,因为它不包含在 聚合函数或 GROUP BY 子句。

【问题讨论】:

  • 您是否显示整个查询?

标签: sql sql-server tsql window-functions


【解决方案1】:

当您使用聚合(如 max)时,您只能使用属于 group by 子句的字段。

如果您希望其他字段将它们添加到 group by 子句中,请去掉“*”。

【讨论】:

    【解决方案2】:
    • 您有 MAX 用于聚合,因此您需要 GROUP BY Id
    • ...这将不起作用,因为您有 ROW_NUMBER
    • 您真的想要楼层和用户之间的笛卡尔积 (CROSS JOIN) 吗?
    • 哪个列属于哪个表?

    也许这可以帮助你到达你想要的地方:

    Select
         row_number() OVER (PARTITION BY userid Order By user.Id) as 'row_number', user.Id,
         max(CASE WHEN  floor.AreaId='[G]' or  floor.AreaId=N'L01'  THEN 'X' ELSE ' ' END) as 'L01',
         max(CASE WHEN floor. AreaId='[G]' or  floor.AreaId=N'L02'  THEN 'X' ELSE ' ' END) as 'L02'
    from
        floor
        JOIN
        user ON floor. = user.    --what?
    where
        user.Id = userID 
    group by
        user.Id
    

    【讨论】:

    • 我认为WHERE id = userid 是 JOIN 标准。
    • Id 为楼层用户id。我错过了它,它应该是'floorusrId'
    • SELECT * from (Select row_number() OVER(Order By FloorUserId) as 'row_number', FloorUserId, max(CASE WHEN AreaId='[G]' or AreaId=N'L01' THEN 'X ' ELSE ' ' END) as 'L01', max(CASE WHEN AreaId='[G]' or AreaId=N'L02' THEN 'X' ELSE ' ' END) as 'L02' from floor, tbuser where Floor.FloorUserId = tbuser.userID ) as derivedTable where row_number BETWEEN 1 AND 20
    猜你喜欢
    • 2013-08-17
    • 2011-05-22
    • 2014-11-02
    相关资源
    最近更新 更多