SQL:Group By on动态值范围

时间:2015-06-05 20:29:02

标签: sql excel oracle range

这与其他一些问题类似,但是那些使用CASE我不能。这是在Oracle上,我将从excel表运行查询。 (顺便说一下,这些不支持WITH,这会让生活变得更加困难)

我在一张大表中有一系列日期 - 例如2011年1月3日,2012年4月5日,2013年7月1日,2013年9月1日...... 然后我有另一张桌子,其中包括员工在某些日期工作的时间。所以我需要做的是获得每个员工在每个中间时间段内工作的小时数。这些表就像

Dates
1-May-2011
5-Aug-2011 
4-Apr-2012
....

和另一个

Employee   Hours   Date
Sam        4       1-Jan-2011
Sam        7       5-Jan-2011
Mary       12      7-Jan-2012
Mary       5       12-Dec-2013
......

所以结果应该是

Employee  Hours   In Date Range Till
Sam       11      1-May-2011
Sam       0       5-Aug-2011
Sam       0       4-Apr-2012
Mary      0       1-May-2011
Mary      0       5-Aug-2011
Mary      12      4-Apr-2012
....

有关如何实现这一目标的任何指示吗?

1 个答案:

答案 0 :(得分:1)

我不熟悉Oracle SQL及其能力/限制,但是既然你要求提供指示,那么这就是我的看法:
加入表(INNER JOIN),加入规则为EmployeeHours.Date < Dates.Dates。然后GROUP BY Employee, Dates.Dates并选择分组列+ SUM(小时)。你最终得到的(使用你的样本数据)是:

Employee |   Dates     |  Hours
Sam      | 1-May-2011  |   11
Sam      | 5-Aug-2011  |   11
Sam      | 4-Apr-2012  |   11
Mary     | 1-May-2011  |   0
Mary     | 5-Aug-2011  |   0
Mary     | 4-Apr-2012  |   12

对于其他(更复杂的)数据,会有更多“有趣”的结果,但基本上每行包含到那时的总小时数。

然后,您可以将其用作外部查询的输入,以查找MAX(Hours)所有行的Dates < currentDates,并从结果中减去该值。

同样,这不是一个完整的答案,但这是一个应该有效的方向。