Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
 Аватар для ruzerone
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 52

Запрос, меняющий поведение, в зависимости от условий

20.07.2015, 17:54. Показов 5798. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые знатоки.


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


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

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


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


1. сканируется таблица clients, где присутствуют 7 значений
имя клиента
ID клиента
Порог срабатывания для рабочего времени (8:00-20:00)
Порог срабатывания для будних дней(вечером)
Порог срабатывания для выходных дней
Порог срабатывания для всего остального времени
статус мониторинга(True - мониторим, False - не мониторим)


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

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

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

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


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

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


T-SQL
1
2
3
4
5
6
7
8
9
10
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)
.........................

Нулевой результат нашел, без Having отбирает все mbox_ID и у кого нулевые результаты и не нулевые, корректно отображает


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

Не делал еще разбиения логики выполнения в зависимости от текущих условий.

И как бы использовать значения ID из таблицы с клиентами, для которых значение мониторинга равно TRUE, а для тех у кого FALSE (игнорить).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2015, 17:54
Ответы с готовыми решениями:

Добавление условий в запрос в зависимости от параметров
Есть у меня функция, работающая, но код большой получился, хочется его оптимизировать. На вход функции подаётся строка, анализируя её я...

Вывод разметки в зависимости от условий
Здравствуйте уважаемые форумчане. Не подскажите как грамотно генерировать разметку, в зависимости от прав в базе данных. Я лично со своим...

Автозаполнение поля в зависимости от условий
Здравствуйте! Есть 3 таблицы: СРМ (ИД, Название, стоимость) Описание (ИД, ценовая категория, ИД_СРМ) Ценовая категория (ИД,...

6
 Аватар для ruzerone
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 52
27.07.2015, 12:32  [ТС]
Вот поверить не смогу, что на IT форуме нет знатоков, которые бы смогли помочь.

грустно...

Добавлено через 14 часов 9 минут
Немного дополню вопрос, как можно доработать запрос, чтобы связка IDклиента и порог срабатывания/отбора записей из табл(2 столбца получается) брались из отдельной таблицы?

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


T-SQL
1
2
3
4
5
6
7
8
9
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
(ID)233 (кол-во)40
(ID)333 (кол-во)700
(ID)123 (кол-во)95

Т.е. идея такая, чтобы использовать данные из таблицы в запросе при его отработке и выборки только интересующих данных
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.07.2015, 13:59
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;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
1
 Аватар для ruzerone
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 52
28.07.2015, 11:05  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;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 прочел, но не совсем понял пару моментов из кода в твоем посте
А именно
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
;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))
как понять часть про

T-SQL
1
2
3
select * from( values
    (1),(2),(3)
    )values_cprov_mbox(mbox_id))
T-SQL
1
2
3
4
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)
T-SQL
1
2
3
    select * from( values
    (1,2),(2,1),(3,2)
    )values_AnotherTable(mbox_id, qty)
То что дальнейший селект будет обращаться к обобщенному_табличному_выражению я понял, но не совсем понятен момент с SELECT .. VALUES (1,2),(2,1),(3,2) & .....

Если возможно, не могли бы вы описать логику запроса в Части с WITH, чтобы было нормальное понимание.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.07.2015, 20:40
ruzerone, ну тестовых таблиц вы не привели - вот и пришлось выдумывать самому тестовые данные.

Надо было сразу привести тестовые данные и желаемый результат на них, а не свой способ решения никому не понятной задачи.
1
 Аватар для ruzerone
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 52
28.07.2015, 23:44  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
ruzerone, ну тестовых таблиц вы не привели - вот и пришлось выдумывать самому тестовые данные.
Надо было сразу привести тестовые данные и желаемый результат на них, а не свой способ решения никому не понятной задачи.
Согласен с размытостью запроса, исправляюсь и на будущее учту.

По тестовым таблицам

cprov_mbox - таблица с ID клиентами, содержит 2 столбца Name(имя клиента) и mbox_id(ID клиента)

out_trx - таблица с записями Содержит 3 столбца ID-клиента(cprov_mbox_id), запись об операции(trx_id) и stored_at (время транзакции)

monit_table - таблица с 4 столбцами, ID клиента, wrk_d(порог для будней), h_d(порог для выходных), status(true или false значения для определения необходимости мониторинга)

По первому запросу из стар поста
используемый запрос для получения рез. набора

T-SQL
1
2
3
4
5
6
7
8
9
USE TrxHist
select cp.mbox_id, COUNT(ot.trx_id) qty
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)
результирующий набор

mbox_idqty
1882992
1950
4704006
5040
5362700
611789
663165
6700
1022376
2653901
48948
38711054
2300
4141320
4660
8151462
8161476
8820
10842112
1900
35877
3720
37421
47616630
84084
8770
10591256
10770
21310984
2270
4721094
5270
5290
561120
5630
11063891
1848368
1930
447888
4520
8044147
23527784
11530



Время которое используется в Between планирую заменить на переменные и использовать функцию getdate

T-SQL
1
2
3
4
5
6
    declare @startTime dateTime
    declare @endTime dateTime
 
    /* определяем время поиска для переменных, на данный момент это -1 час с hh:00:00.000 по hh:59:59:997  где hh значение часа дня (-1 от текущего часа)*/
    set @startTime=CAST((convert(char(14),dateadd(HOUR,-2,GETDATE()),120) + '00') as datetime)
    set @endTime=CAST((convert(char(14),dateadd(HOUR,-1,GETDATE()),120) + '59:59.997') as datetime)
Выглядеть промежуток времени будет примерно так

T-SQL
1
BETWEEN @startTime and @endTime
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2015, 07:56
ruzerone, исходные данные где?
T-SQL
1
2
3
4
5
6
7
8
select top(3) * into #cprov_mbox from cprov_mbox order by newid();
select top(5) * into #out_trx from out_trx 
  where cprov_mbox_id in(select id from #cprov_mbox) order by newid();
select top(5) * into #monit_table from monit_table 
  where cprov_mbox_id in(select id from #cprov_mbox) order by newid();
select * from #cprov_mbox;
select * from #out_trx;
select * from #monit_table;
И где требуемый на этих данных результат? То есть не результат вашего запроса, а та таблица, которая должна получиться согласно постановке задачи.

Немного дополню вопрос, как можно доработать запрос, чтобы связка IDклиента и порог срабатывания/отбора записей из табл(2 столбца получается) брались из отдельной таблицы?
ответ в предыдущем посте. Сделайте таблицу AnotherTable и уберите все CTE из запроса, делов-то...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2015, 07:56
Помогаю со студенческими работами здесь

Выбор ячейки в зависимости от условий
Требуется выбрать одно из значений для подстановки в формулу. Формула для расчета A3= A1/А2 или А3. А3 подставляем в случае , если...

Появление объектов в зависимости от условий
Расскажите, пожалуйста, как сделать такое: Например, есть комбобокс с двумя строками (умножить и площадь круга). при выборе умножения,...

Объявление переменных в зависимости от условий
Возможно ли каким-то образом объявлять переменные в Делфи в зависимости от каких-либо условий? Например, если определенная переменная равна...

Расчет значения в зависимости от нескольких условий
Определить сумму «к выплате», которая получена в результате расчетов заработной платы работникам сектора (пять работников), если начисления...

Выполнение условий в зависимости от значений в ComboBox
Если ComboBox1.SelectedItem = &quot;1&quot; или ComboBox1.SelectedItem = &quot;2&quot; То выполняет действие Х Иначе ComboBox1.SelectedItem =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru