2015-06-05 4 views
1

Это похоже на некоторые другие вопросы здесь, но те используют CASE, который я не могу. Это на Oracle, и я буду запускать запрос с листа excel. (И, кстати, они не поддерживают WITH, что значительно усложняет жизнь)SQL: Group By по диапазону динамических значений

У меня есть ряд дат в одном большом столе - например 1/3/2011, 5/5/2012, 7/1/2013 , 9/1/2013 ..... Затем у меня есть еще один стол с часами, отработанные сотрудниками в определенные даты. Так что мне нужно сделать, это получить количество часов, отработанных каждым сотрудником за каждый промежуточный период времени. Таким образом, таблицы, как

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 
.... 

Любые указатели о том, как добиться этого, пожалуйста?

+0

У вас есть ошибка в желаемом результате. Вопрос: какая-то конкретная реализация/вкус/сервер? – Amit

+0

, если он находится на Oracle, не следует ли его помечать? – Beth

+0

Хмм, я не вижу ошибки. – user2689782

ответ

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 и вычесть это из вашего результата.

Опять же, это не полный ответ, но это направление, которое должно работать.

+0

Хорошо, я попробую это. – user2689782