Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Поиск отсутствующих данных по нескольким условиям. MSSQL 2008 R2 (http://forum.oszone.net/showthread.php?t=302649)

pingUIN 20-07-2015 12:38 2530506

Поиск отсутствующих данных по нескольким условиям. MSSQL 2008 R2
 
Здравствуйте уважаемые знатоки.


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


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

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


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


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 2532905

Немного дополню вопрос, как можно доработать запрос, чтобы связка 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 2533279

Я тут на соседних форумах поспрашал, со мной поделились кодом по теме задачи

Код:

;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, как его можно интерпретировать на человеческий язык если рассматривать логику ?


Время: 03:15.

Время: 03:15.
© OSzone.net 2001-