【问题标题】:Count the accumulated hours within a column计算一列中的累计小时数
【发布时间】:2014-01-21 15:21:37
【问题描述】:

我有一张表格,其中包含有关工人从事的工作类型和花费在工作上的小时数的信息。

例如。

work_id | user_id | work_type | hours_spent
-------------------------------------------------   
    1   |     1   |  Maintain |     7
    2   |     1   |  sick     |     4  
    3   |     1   |  maintain |     3
    4   |     1   |  maintain |     6
    5   |     2   |  Web      |     5
    6   |     2   |  Develop  |     8
    7   |     2   |  develop  |     5
    8   |     3   |  maintain |     5
    9   |     3   |  sick     |     7
    10  |     3   |  sick     |     7

我想计算每个用户在某类工作上花费的累计小时数,以显示如下内容:

user id | work_type | hours_spent
-----------------------------------
    1   |  maintain |     16 
    1   |  sick     |      4
    2   |  Web      |      5
    2   |  develop  |     13
    3   |  maintain |      5
    3   |  sick     |     14

我现在使用的 sum() 函数返回 hours_spent 列中的所有小时数。这是我想要实现的正确功能吗?

我使用的是 SQL Server 2008 R2。

【问题讨论】:

  • 您能否显示您现在正在使用的查询,该查询似乎无法提供您想要的结果?
  • 我宁愿不这样做,因为这对我来说非常尴尬。我通过一个子查询来查找总小时数,从而使事情变得复杂......
  • 嗯,我们曾经都是初学者。展示您的作品有助于我们更好地确定您的错误所在,并帮助您更快地学习。
  • 我在访问权限中使用了一个公式来查找每个人在某种工作类型上花费的时间百分比,有没有办法获得每个用户在某项工作上花费的时间的总和?工作类型?
  • 没关系,似乎我已经能够通过对每种工作类型使用子查询在 SQL 中做到这一点。结果与每条记录一起打印,但它有效!

标签: sql sql-server count sum


【解决方案1】:
SELECT 
  user_id, 
  work_type = LOWER(work_type), 
  hours_spent = SUM(hours_spent)
FROM dbo.tablename
GROUP BY user_id, LOWER(work_type)
ORDER BY user_id, LOWER(work_type);
  • 你不需要LOWER(),除非你有区分大小写的排序规则。如果这样做,请始终输入这些字符串 - 或者更好的是,使用查找表来查找这些字符串并将 tinyint 存储在主表中。

【讨论】:

  • 我猜 OP 甚至没有注意到数据和结果之间的大小写差异。
  • @GordonLinoff 可能是真的,但我想确保我提到了它。
  • 这太好了,谢谢!现在我只需要将分钟(未提及)添加到小时,但我可以自己做。是的,我的错误,应该全部小写
猜你喜欢
  • 2020-12-17
  • 2022-11-14
  • 1970-01-01
  • 2015-11-18
  • 2018-03-26
  • 2011-08-07
  • 2019-10-07
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多