【问题标题】:Using sum with order by clause in SQL Server在 SQL Server 中使用 sum 和 order by 子句
【发布时间】:2016-12-31 11:05:32
【问题描述】:

我想查看过去 3 个月(即 90 天)工作时间最长的培训师的数据。我创建了一个存储过程来查看前3个月的小时总和,现在我只想添加group by子句(group by trainer

这是我的存储过程,请给我建议我需要做的更改

begin      
declare @h int      
declare @m int      
declare @tm int      
declare @min int      
declare @count int  
declare @d varchar(30)
declare @dt datetime
declare @d1 varchar(30)
declare @dt2 datetime

declare @dt1 datetime

set @dt = (select convert(datetime, (dateadd(day, -90, getdate())), 105))
set @d = (select convert(varchar, @dt, 105))

set @dt1 = (select convert(datetime, getdate(), 105))
set @d1 = (select convert(varchar, @dt1, 105))
set @dt2 = (select convert(datetime, @d1, 105))

set @h = (SELECT SUM(DATEPART(hh, (convert(datetime, hrs, 1))))       
          FROM sonvininsert 
          WHERE date BETWEEN convert(datetime, @d, 105) AND convert(datetime, @d1, 105)      
            AND instructore = 'primary' 
            AND status = '0' 
          GROUP BY trainer)      

set @tm = (SELECT SUM(DATEPART(mi, (convert(datetime, hrs, 1))))       
           FROM sonvininsert 
           WHERE date BETWEEN convert(datetime, @d, 105) AND convert(datetime, @d1, 105)      
             AND instructore = 'primary'   
             AND status = '0' 
           GROUP BY trainer)      

set @m = @tm / 60      
set @min = @tm % 60      
set @h = @h + @m      

select @h as hour
end 

出现以下错误:

消息 512,第 16 级,状态 1,第 25 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

消息 512,第 16 级,状态 1,第 30 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我希望我的查询是这样的

group by trainer 
order by trainer desc

【问题讨论】:

  • 你想为所有trainers做这个?
  • @Prdp 是的,我想和所有教练一起做这个

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


【解决方案1】:

尝试类似.....

begin      
declare @h int ,@m int ,@tm int , @min int , @count int ,@d varchar(30)
       ,@dt datetime , @d1 varchar(30) , @dt2 datetime , @dt1 datetime

select @dt  = convert(datetime,(dateadd(day,-90,getdate())),105)    
select @d   = convert(varchar,@dt,105) 
select @dt1 = convert(datetime,getdate(),105)
select @d1  = convert(varchar,@dt1,105)
select @dt2 = convert(datetime,@d1,105)

select trainer 
     , sum(DATEPART(hh,(convert(datetime,hrs,1))))    
       + sum(DATEPART(mi,(convert(datetime,hrs,1)))) / 60 AS [Hour]
FROM sonvininsert 
where date  between convert(datetime,@d,105) 
                and convert(datetime,@d1,105)      
and instructore='primary' 
and status='0' 
group by trainer     

end 

【讨论】:

    【解决方案2】:

    ..group by trainer在子查询中是错误的原因。子查询将找到每个培训师的总和,但您分配给变量。

    这是为所有trainers 执行此操作的一种方法

    ;WITH cte
         AS (SELECT trainer,
                    Sum(Datepart(hh, ( CONVERT(DATETIME, hrs, 1) ))) AS H,
                    Sum(Datepart(mi, ( CONVERT(DATETIME, hrs, 1) ))) AS tm
             FROM   sonvininsert
             WHERE  date BETWEEN CONVERT(DATETIME, @d, 105) AND CONVERT(DATETIME, @d1, 105)
                    AND instructore = 'primary'
                    AND status = '0'
             GROUP  BY trainer)
    SELECT trainer,
           m = tm / 60,
           [min] = tm % 60,
           [hour] = h + m
    FROM   cte 
    ORDER BY trainer desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多