2010-09-22 8 views
1

У меня возник вопрос о том, как «сворачивать/суммировать» (не имея лучшего слова) некоторые данные на сервере SQL. Данные - это, в основном, смены штатов, а затем часы, потерянные из этих смен. Так, например, у меня есть запись в одной таблицеОбщее количество серверов SQL/pivot

Staff_ID Shift_start Shift_end 
37  09:00   17:30 

И тогда мы дадим этому человеку обед в другой таблице

Staff_ID  Start  End 
37   13:00  14:00 

Конечно у нас есть несколько агентов в течение дня и схема выше упрощается, но вы получаете идею. Затем оно преобразуется в число сотрудников за 15 минут

Interval Staff 
09:00  5 
09:15  7 
09:30  6 

И так далее.

В настоящий момент SQL-сервер хранит все это, но, чтобы «суммировать» агенты, я должен принести вещи в Access и использовать массивы, чтобы выяснить количество сотрудников за каждые 15-минутный период, а затем сохранить эти данные обратно в база данных. Это быстрый процесс (< 1500 мс), но то, что я ищу, это способ сделать это на самом SQL-сервере и не нужно приносить вещи в Access и записывать их обратно.

Я лаяю неправильное дерево с этим?

EDIT:

Я использую SQL сервера 2008R2 Экспресс

+0

PLS. указать версию сервера sql – Beth

+0

@Beth, я использую SQL-сервер 2008R2 Express –

ответ

1

Update

Попробуйте это:

;with Intervals(start) as --00:00 - 23:45 
(
select dateadd(minute, 0,0) 
union all 
select dateadd(minute, 15, start) from Intervals 
where datediff(hour, 0, dateadd(minute, 15, start))<24 
) 
select convert(varchar, i.start, 108) [Interval], count(*) [Staff] 
from Intervals i 
join 
(
    select cast('09:31:29' as datetime) [start], cast('17:11:29' as datetime) [end] union all 
    select cast('10:43:12' as datetime), cast('18:21:29' as datetime) union all 
    select cast('11:59:53' as datetime), cast('19:51:29' as datetime) 
)s 
on cast(convert(varchar(10), s.start, 108)as datetime) <= i.start 
and dateadd(minute, 15, i.start) <= cast(convert(varchar(10), s.[end], 108) as datetime) 
group by convert(varchar, i.start, 108) 
+0

Денис, Спасибо за ваш код, но это не совсем то, что я искал. Из того, что я могу видеть (и я открыт для исправления), когда я запускаю это, это просто говорит мне, сколько штатов начали свои смены через определенные промежутки времени. То, что мне нужно, это если кто-то начнет свою смену в 09:00 и закончится в 17:30, они появятся в 09:00, 09:15, 09:30, 09:45 ....... 17:00 и 17:15. –

+0

@ Кевин Росс Я вижу ... обратно на чертежную доску. –

+0

Денис, спасибо за то, что он вернулся к чертежной доске, на которой он работал. Я теперь набираю несколько из них, чтобы получить полный запрос, т. Е. [Персонал в смену] + [Сверхурочная работа] - [Праздник] - [Обед/перерывы и т. Д.] –

0

У вас есть несколько подходов, вы могли бы попробовать. Можно было бы взять именно то, что у вас есть в Access, и преобразовать его в SQL. Если есть часть этого, вы не знаете, как это сделать, разместите его здесь, и мы сможем помочь.

Другим вариантом будет использование курсора (в отличие от одной функции набора) для повторения каждого 15-минутного периода времени, загрузки персонала, работающего в течение этого периода, или расписания каждого сотрудника, заполняющего все их рабочие 15- минутных периодов времени. Возможно, вы уже делаете это в Access, я не могу сказать.

Поскольку они являются одинаковыми 15-минутными периодами каждый день, вы можете хранить время в таблице и выполнять внешнее соединение на них, но производительность может быть хуже, чем ваш процесс доступа.

Смежные вопросы