Войти

Показать полную графическую версию : Поиск отсутствующих данных по нескольким условиям. MSSQL 2008 R2


pingUIN
20-07-2015, 12:38
Здравствуйте уважаемые знатоки.


Возникла задача, но не совсем пока понимаю с какой стороны к ней подойти.


Есть БД, которая содержит в себе данные за последние сутки.

В этой БД есть информация по совершенной операции и клиенте, который ее проводил.(т.е. один клиент может проводить сколько угодно операций/транзакций)


Как следует подойти к процессу сбора статистики, если есть несколько условий, которые надо выполнить, а именно:


1. сканируется таблица clients, где присутствуют 4 значения
имя клиента
ID клиента
Порог срабатывания по имеющимся данным(т.е. если установлено 40, то в случае если операций было выполнено меньше 40 или ни одной, то нас этот клиент интересует)
статус мониторинга(True - мониторим, False - не мониторим)


2. идет обращение к таблице out_trn в которой происходит поиск транзакций к примеру за час, поиск осуществляется по клиентам(их ID) из п.1, у кого статус мониторинга = TRUE.

3. По выбранным клиентам(за кем осуществляется мониторинг), собранная статистика собирается в таблицу monitor_table
Если по клиенту порог срабатывания 3.../...7 операции, а у клиента их нет(т.е. 0 или же ниже порога), надо создать запись в monitor_table

столбец 1 | столбец 2

КлиентААА | транзакций нет
КлиентБББ | 6 транзакций


В случае с поиском существующих значений, проблем нет, но вот поиск отсутствующих значений и преобразование пустоты(отсутствия результата в некую строку) есть проблемы ввиду не достаточных познаний.

Написал пробный вариант, чтобы посмотреть на результат отбора


select cp.mbox_id, COUNT(ot.trx_id)
from [Trxhist].[dbo].[out_trx] ot
LEFT OUTER JOIN [Trxhist].[dbo].[cprov_mbox] cp
ON cp.mbox_id = ot.cprov_mbox_id
where ot.stored_at BETWEEN '2015-07-17 03:23:39.000' and '2015-07-17 06:23:39.000'
GROUP BY cp.mbox_id
На выходе получил

mbox_id (No column name)
184 8368
188 2992
213 10984
235 27784
241 43
265 3901
294 2353
358 77.........................

Нулевых результатов не обнаружил :(



================================================
Немного поработал с запросом, получилось выводить 0ые результаты.



USE Trxhist
select cp.mbox_id, COUNT(ot.trx_id)
from
Trxhist.dbo.[cprov_mbox] AS cp
LEFT OUTER JOIN
[Trxhist].[dbo].out_trx AS ot
ON (ot.cprov_mbox_id = cp.mbox_id)
and ot.stored_at BETWEEN '2015-07-17 03:23:39.000' and '2015-07-17 06:23:39.000'
GROUP BY cp.mbox_id
having cp.mbox_id in (246)



===============================

Можно ли каким-нибудь образом сделать разный порог срабатывания, скажем в будние дни от 10 транзакций, а ввыходные чтобы порог был нулевым?
Не делал еще разбиения логики выполнения в зависимости от текущих условий.

pingUIN
27-07-2015, 11:19
Немного дополню вопрос, как можно доработать запрос, чтобы связка IDклиента и порог срабатывания/отбора записей из табл(2 столбца получается) брались из отдельной таблицы?

К примеру если указывать ID клиента и кол-во транзакций, я бы отобразил это так(для конкретного клиента)


USE Trxhist select cp.mbox_id, COUNT(ot.trx_id)
from Trxhist.dbo.[cprov_mbox] AS cp
LEFT OUTER JOIN [Trxhist].[dbo].out_trx AS ot
ON (ot.cprov_mbox_id = cp.mbox_id)
and ot.stored_at BETWEEN '2015-07-17 03:23:39.000' and '2015-07-17 06:23:39.000'
GROUP BY cp.mbox_id
having cp.mbox_id in (246) and COUNT(ot.trx_id) < 50
having cp.mbox_id in (246) and COUNT(ot.trx_id) < 50

Можно скажем значения cp.mbox_id & кол-во транзакций(в моем случае 50), брать из другой таблицы и при этом использовать значения более чем для одного IDклиента?


К примеру для клиента с ID
(ID)233 (кол-во)40
(ID)333 (кол-во)700
(ID)123 (кол-во)95

Т.е. идея такая, чтобы использовать данные из таблицы в запросе при его отработке и выборки только интересующих данных

pingUIN
28-07-2015, 11:09
Я тут на соседних форумах поспрашал, со мной поделились кодом по теме задачи


;with cprov_mbox as (
select * from( values
(1),(2),(3)
)values_cprov_mbox(mbox_id))
,out_trx as (
select * from( values
(1,1,cast('20150717 05:30' as datetime)),
(2,2,'20150717 05:30')
)values_out_trx(trx_id, cprov_mbox_id, stored_at))
,AnotherTable as (
select * from( values
(1,2),(2,1),(3,2)
)values_AnotherTable(mbox_id, qty))
select cp.mbox_id, COUNT(ot.trx_id) qty
from AnotherTable p
join cprov_mbox cp on cp.mbox_id=p.mbox_id
LEFT JOIN out_trx AS ot ON (ot.cprov_mbox_id = cp.mbox_id)
and ot.stored_at BETWEEN '20150717 03:23:39' and '20150717 06:23:39'
GROUP BY cp.mbox_id, p.qty
having COUNT(ot.trx_id) < p.qty

Может ли мне кто из знающих, если таковые имеются, пояснить момент с WITH(что делает функция понимаю), а вот селекты в ней, не совсем понятны.

К примеру рассмотреть если

select * from( values
(1,1,cast('20150717 05:30' as datetime)),
(2,2,'20150717 05:30')
)values_out_trx(trx_id, cprov_mbox_id, stored_at))


что за код после VALUES, как его можно интерпретировать на человеческий язык если рассматривать логику ?




© OSzone.net 2001-2012