【问题标题】:How to use Group by clause in select statement如何在 select 语句中使用 Group by 子句
【发布时间】:2014-05-15 10:13:22
【问题描述】:
DECLARE @Result nvarchar(50)
SET @Result = (select top 1
    ROUND(SUM(DATEDIFF(SS,CheckIn,'2014-05-15 03:30:32.507') / 60.0 / 60.0),2)
  from CheckInCheckOut
  where UserId_Fk=3
  order by CheckInCheckOutId desc) 

update CheckInCheckOut 
set CheckOut='2014-05-15 03:30:32.507',CountHours=@Result 
where CheckInCheckOutId = (select top (1) CheckInCheckOutId  
           from CheckInCheckOut 
           where UserId_Fk = 3
           order by CheckInCheckOutId desc )

当我尝试使用它时,我得到错误:

 'Column "CheckInCheckOut.CheckInCheckOutId" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

在这种情况下,select语句中的group by子句怎么办?

【问题讨论】:

    标签: sql-server group-by sql-update sql-order-by


    【解决方案1】:

    您可以使用适当的聚合函数来定义最大 CheckInCheckOutId:

    DECLARE @Result nvarchar(50),@MaxCheckInCheckOutId int
    
    --this value is calculated one time for the whole batch
    set @MaxCheckInCheckOutId = (select MAX(CheckInCheckOutId) from CheckInCheckOut where UserId_Fk=3)
    
    set @Result = (select ROUND(SUM(DATEDIFF(SS,CheckIn,'2014-05-15 03:30:32.507') / 60.0 / 60.0),2)
      from CheckInCheckOut where UserId_Fk=3 and CheckInCheckOutId=@MaxCheckInCheckOutId) 
    
    update CheckInCheckOut 
    set CheckOut='2014-05-15 03:30:32.507',CountHours=@Result 
    where CheckInCheckOutId = @MaxCheckInCheckOutId
    

    一些提示:

    1. 您也没有提及您的 SQL Server 版本,也许在 2000 台以上的服务器中使用 CTE(公用表表达式)会更好。
    2. 在这里您可能会遇到参数嗅探,因此需要“选项(重新编译)”或类似的东西以获得更好的性能。

    【讨论】:

      【解决方案2】:

      当您在查询中使用聚合函数时,如果您使用了不在任何聚合函数中的另一个属性,则需要在group by 子句中提及它。
      在您的 t-sql 开头:

      SET @Result = (select top 1 ROUND(SUM(DATEDIFF(SS,CheckIn,'2014-05-15 03:30:32.507') /    60.0 / 60.0),2)
            from CheckInCheckOut
            where UserId_Fk=3
            group by CheckInCheckOutId
            order by CheckInCheckOutId desc)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多