Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчет событий в запросе  [new]
zzz68
Member

Откуда:
Сообщений: 75
Форумчане, пожалуйста помогите с быстрым движком в запросе.
Есть таблица, в которую каждый час попадают сведения по продажам из программы учета.
Операторы продают книги и каждый час информация о кол-ве проданных книг попадает в БД.
Кол-во отражается накопительным итогом, т.е. Оператор1 в 9:00 ничего не продал, в 10:00 продал 7 книг, в 11:00 у него уже продано 12 книг (включая 7 за прошлый час), в 12:00 у него продано уже 14 книг, в 13:00 у него так и осталось 14 книг и т.д.

Необходимо посчитать кол-во часов за дату, в которые оператор реально продавал книги, т.е. 9:00 ничего не продано, значит час не считаем, 10:00 считаем как 1 час успешной работы, 11:00 считаем как 1 час успешной работы, 12:00 считаем как 1 час, так как кол-во проданных книг в эти часы увеличивалось, 13:00 час не считаем, так как кол-во книг не изменилось
Итого по оператору1 должно получиться 3 часа реальных продаж за 07.07.2012 и так далее для оператора2, оператора3

Необходим очень надежный и быстрый алгоритм, так как записей в БД очень много.

Буду бесконечно благодарен за предложенные идеи.
8 июл 12, 03:28    [12834950]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет событий в запросе  [new]
aleks2
Guest
Да, блин, чему нонича в школах учат?
with
tbl as (select [каждый час ] as hour
             , [Кол-во отражается накопительным итогом] as num
             , [оператор] as op  
             , [дата] as date
             from [Есть таблица])

select date, op, COUNT(distinct num) from tbl group by date, op
8 июл 12, 06:53    [12835057]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет событий в запросе  [new]
qwerty112
Guest
имхо, это ещё нужно (?)
aleks2
with
tbl as (select [каждый час ] as hour
             , [Кол-во отражается накопительным итогом] as num
             , [оператор] as op  
             , [дата] as date
             from [Есть таблица]
             where [Кол-во отражается накопительным итогом] >0)

select date, op, COUNT(distinct num) from tbl group by date, op

zzz68
Кол-во отражается накопительным итогом, т.е. Оператор1 в 9:00 ничего не продал, в 10:00 продал 7 книг, в 11:00 у него уже продано 12 книг (включая 7 за прошлый час), в 12:00 у него продано уже 14 книг, в 13:00 у него так и осталось 14 книг и т.д.

операторкаждый часКол-во отражается накопительным итогом
Оператор19:000
Оператор110:007
Оператор111:0012
Оператор112:0014
Оператор113:0014
8 июл 12, 10:34    [12835121]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет событий в запросе  [new]
zzz68
Member

Откуда:
Сообщений: 75
aleks2,

В предложенном варианте посчитаются все часы работы операторов, даже если он ничего не продал. Дело в том, что программа начиная с 0 часов опрашивает кассу в течении 24 часов и половину времени там будут стоять 0 (оператор1 спал дома), а оператор2 работал в ночную смену.
Так же, стоит задача посчитать только реальные часы продажи, т.е. если у оператора кол-во проданных книг не изменилось в плюс на 1 книгу за следующий час, то этот час не должен попадать в расчет.
8 июл 12, 13:45    [12835307]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет событий в запросе  [new]
zzz68
Member

Откуда:
Сообщений: 75
aleks2,

Алекс2, прости, не обратил внимание на distinct num в функции count

Должно сработать
8 июл 12, 13:49    [12835313]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет событий в запросе  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1980
zzz68,

не забудьте в конец запроса условие
where num>0

иначе посчитает и один из часов, когда продаж не было
9 июл 12, 14:46    [12838985]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить