我希望根据另外两列来计算一列,但在一些特殊情况下,计算必须考虑多行。
这是现在的查询:
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%。
我需要查询...
- 汇总某一天的所有工作时间
- 将其除以当天的最长可用时间
- 将该值放入每行的 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),前提是这五分钟是您当时可用的全部时间天。您仍然可以添加另一列来指示该项目当天的HoursWorked
与HoursAvailable
的百分比>(在大多数系统中,它应该与该项目的优先级大致成比例)。
关于SQL 从两行计算一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922988/