SQL 从两行计算一列

标签 sql multiple-columns calculated-columns

我希望根据另外两列来计算一列,但在一些特殊情况下,计算必须考虑多行。

这是现在的查询:

SELECT
    UserName
    , EntryDate
    , Project
    , HoursWorked
    , HoursAvailable
    , UtilPct as HoursWorked / HoursAvailable
FROM
    MyDatabase
ORDER BY
    EntryDate

结果是:

UserName EntryDate <code></code> <code></code>Project HoursWorked HoursAvailable UtilPct<br/> Justin <code></code> <code></code> <code></code> 12/17/2012 ABC <code></code> <code></code> <code></code> <code></code> <code></code>8 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> 8 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code>100<br/> Justin <code></code> <code></code> <code></code> 12/18/2012 ABC <code></code> <code></code> <code></code> <code></code> <code></code>4 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> 8 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code>50<br/> Justin <code></code> <code></code> <code></code> 12/18/2012 DEF <code></code> <code></code> <code></code> <code></code> <code></code>4 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> 8 <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code> <code></code>50<br/>

但是最后两个条目的 50% 利用率是错误的,因为两者发生在同一天。这两行都应显示 100%。

我需要查询...

  1. 汇总某一天的所有工作时间
  2. 将其除以当天的最长可用时间
  3. 将该值放入每行的 UtilPct 列中

我怎样才能做到这一点?

最佳答案

I need the query to...

Sum up all of the HoursWorked for a certain day Divide that by the max HoursAvailable for that day Put that value into the UtilPct column for each row

How do I make it do that?

总结所有工作时间:

SUM(HoursWorked) ... GROUP BY EntryDate

将其除以当天的最大可用小时数

SUM(HoursWorked)/MAX(HoursAvailable) ... GROUP BY EntryDate

将该值放入每行的 UtilPct 列中:

SELECT ... SUM(HoursWorked)/MAX(HoursAvailable)*100.0 AS UtilPct
    FROM MyDatabase
    GROUP BY EntryDate
    ORDER BY EntryDate

但现在您将无法按项目划分行,您只能看到任何一天的时间利用率。如果您尝试GROUP BY Project,您将再次获得 50% 而不是 100%。

那是因为您要求 4/8 为 100%,这会得到语义上无意义的答案,例如“星期二,我 100% 地完成项目 ABC,而且 100% 致力于 DEF 项目”,对此,人们可以回答“那么周二你们有 200% 的投入?”

您可以使用表与其自身之间的 JOIN 来解决这一难题,以获取一天内的 TotalHoursWorked ,这在语义上是不同的来自单个项目的工作时间:

SELECT
    UserName
    , md1.EntryDate
    , Project
    , HoursWorked
    , HoursAvailable
    , (TotalHoursWorked / HoursAvailable)*100.0 AS UtilPct
FROM
    MyDatabase AS md1
    JOIN ( 
        SELECT EntryDate, SUM(HoursWorked) AS TotalHoursWorked
        FROM MyDatabase GROUP BY EntryDate
    ) AS md2 ON (md1.EntryDate = md2.EntryDate)
ORDER BY
    md1.EntryDate

现在,UtilPct 将指当天的时间使用情况,这意味着即使您只工作了五分钟,您也可以获得项目 100% 的值(value),前提是这五分钟是您当时可用的全部时间天。您仍然可以添加另一列来指示该项目当天的HoursWorkedHoursAvailable的百分比>(在大多数系统中,它应该与该项目的优先级大致成比例)。

关于SQL 从两行计算一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922988/

相关文章:

linux - 可变长度表的 Bash 列总和

ruby - 为什么在读取 CSV 文件时会有尾随列?

python-3.x - pandas 数据框列转换

mysql - 更新行时是否总是触发生成列的计算?

r - 在大型数据库中的 R 中创建列

SQL - 按自定义 24 小时周期对结果进行分组

c# - 为什么我的查询不运行?

java - MySQL 命令在列中选择值 - JDBC

SQL Server BIGINT 或 DECIMAL(18,0) 主键

html - Bootstrap 2列,2个背景扩展