Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Agney Member Откуда: Сообщений: 12 |
Добрый день! У меня не достаточно опыта, чтобы сделать то, что вроде бы сделать просто. Больше 10 ч пробую ловить выход с группы заявки. 1. act_reg.remarks LIKE '%OTRS%' - это определённый комментарий, но он есть не у всех. 2. incident.inc_resolve_svd - это id группы. У меня их 3 шт. У каждой свои особенности. Одна заявка может быть на нескольких группах по истории путешествий. 3. act_type.act_type_id = 31 - чувствую, что мешает. Тип действия "Изменены доп поля", но если идёт 2й When в CASE, то он по идее должен игнориться, и это думаю мешает. 4. FROM - при большем количестве связей выгрузка пустая. Тут минимальное количество связи всех таблиц между собой. SELECT TOP (1000) incident.incident_ref, act_reg.date_actioned AS [Дата выхода из группы1], incident.inc_resolve_svd, CASE WHEN incident.inc_resolve_svd IN (1362, 1363, 1364) AND act_reg.remarks LIKE '%OTRS%' AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) > 1)) THEN act_reg.date_actioned WHEN incident.inc_resolve_svd IN (1363, 1363, 1364) AND act_reg.remarks NOT LIKE '%OTRS%' AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) = 1)) THEN incident.inc_resolve_act END AS [Дата выхода из группы2], serv_dept_1.serv_dept_n AS [Исполняющая группа] FROM act_reg INNER JOIN incident ON act_reg.incident_id = incident.incident_id INNER JOIN act_type ON act_reg.act_type_id = act_type.act_type_id INNER JOIN serv_dept AS serv_dept_1 ON act_reg.ass_svd_id = serv_dept_1.serv_dept_id WHERE /*(act_reg.remarks LIKE '%OTRS%') AND*/ (incident.date_logged BETWEEN '2019-04-01' AND '2019-06-27') AND (act_type.act_type_id = 31) --31 - это название типа действия "Изменены доп поля". AND incident.inc_resolve_svd IN (1362, 1364, 1363) GROUP BY incident.incident_ref, incident.inc_resolve_svd, act_reg.date_actioned, act_reg.remarks, act_type.act_type_id, incident.inc_resolve_act, serv_dept_1.serv_dept_n Правильно ли я составил CASE? Извините, возможно за тривиальный вопрос. |
4 июл 19, 12:15 [21920640] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1294 |
Формально - case правильный, разве только ELSE не хватает. Кто будет исполнять все прочие заявки? Но бизнеслогично его тока ты могешь проверить. |
4 июл 19, 12:36 [21920671] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
aleks222, Т.е. такой COUNT может отрабатывать? По моей задумке (я забыл про ELSE) второй WHEN ловил большинство других вариантов. Но теперь я понял, что надо пересчитать. Уже наводка. |
4 июл 19, 12:49 [21920686] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
Во втором IN() 1363 написано дважды. Опечатка? Вы используете общее количество записей в запросе для act_type.act_type_id IS NOT NULL - это так и задумывалось? Со стороны-то трудно судить об этом... |
4 июл 19, 13:08 [21920696] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
iap, Да, опечатка для форума. Я несколько вариаций уже пробовал и уже на форум немного дописал. Приложил скриншот. Крайний справа столбик имеет названия, но не всегда - иногда пусто (NULL), но при этом тип действия нужный мне - первый столбик. Вот чтобы не гадать - делаю исключение из общего списка. Трудно передать это. У меня составной отчёт из 6 view, которые я ещё не успел объединить, а требуют доработку уже существующих. Основное что я ловлю - время операции. |
4 июл 19, 13:47 [21920736] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
Не могу сделать вложение - PNG 38 кб К сообщению приложен файл. Размер - 38Kb |
4 июл 19, 13:49 [21920739] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Agney, (1363, 1363, 1364) повторяется. |
4 июл 19, 14:01 [21920753] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
Владислав Колосов, Да, спасибо! Выше я уже написал, что это была опечатка при переносе на форум. На код она не влияла. Сейчас код выглядит так: /****** Скрипт для команды SelectTopNRows из среды SSMS ******/ SELECT TOP (1000) incident.incident_ref, act_reg.date_actioned AS [Дата выхода из группы1], incident.inc_resolve_svd, CASE WHEN incident.inc_resolve_svd = (1363) AND (act_type.act_type_id = 31) --31 - это название типа действия "Изменены доп поля". AND act_reg.remarks LIKE '%OTRS%' AND act_reg.serv_dept_id = (1363) AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) > 1)) THEN MAX(act_reg.date_actioned) WHEN incident.inc_resolve_svd = (1363) AND act_reg.remarks NOT LIKE '%OTRS%' AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) = 1)) THEN incident.inc_resolve_act WHEN act_reg.serv_dept_id = (1363) AND serv_dept_1.serv_dept_n != 'Сопровождение POS филиалы' THEN MAX(act_reg.date_actioned) --ELSE END AS [Дата выхода из группы2], serv_dept_1.serv_dept_n AS [Исполняющая группа], act_reg.serv_dept_id FROM act_reg INNER JOIN incident ON act_reg.incident_id = incident.incident_id INNER JOIN act_type ON act_reg.act_type_id = act_type.act_type_id INNER JOIN serv_dept AS serv_dept_1 ON act_reg.ass_svd_id = serv_dept_1.serv_dept_id WHERE (incident.date_logged BETWEEN '2019-04-01' AND '2019-06-27') --AND act_reg.serv_dept_id = (1363) --AND serv_dept_1.serv_dept_n = 'Сопровождение POS филиалы' AND incident.incident_ref = 96139 --AND incident.inc_resolve_svd IN (1363) GROUP BY incident.incident_ref, incident.inc_resolve_svd, act_reg.date_actioned, act_reg.remarks, act_type.act_type_id, incident.inc_resolve_act, serv_dept_1.serv_dept_n, act_reg.serv_dept_id Теперь выходят нужные значения, но...их 48, а мне надо бы 1) К сообщению приложен файл. Размер - 47Kb |
4 июл 19, 16:19 [21920898] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Agney, я бы сделал тремя запросами с объединением результатов. Вы в WHEN пишете то, что надо писать в EXISTS () и HAVING. |
4 июл 19, 16:27 [21920907] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
Как бы прописать в CASE WHEN incident.inc_resolve_svd = (1363) AND (act_type.act_type_id = 31) --31 - это название типа действия "Изменены доп поля". AND act_reg.remarks LIKE '%OTRS%' AND act_reg.serv_dept_id = (1363) AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) > 1)) THEN MAX(act_reg.date_actioned) WHEN incident.inc_resolve_svd = (1363) AND act_reg.remarks NOT LIKE '%OTRS%' AND (act_type.act_type_id = 1 AND (COUNT(act_type.act_type_id) = 1)) THEN incident.inc_resolve_act WHEN act_reg.serv_dept_id = (1363) AND serv_dept_1.serv_dept_n != 'Сопровождение POS филиалы' THEN MAX(act_reg.date_actioned) --ELSE END AS [Дата выхода из группы2] Если
act_type_n = 'Attachment Added'
то берём время act_reg.date_actioned Т.е. если тип действия Attachment Added (act_type_id = 5000054), то надо вывести его act_reg.date_actioned. В WHEN столько всего засунуто, что уже не знаю как его прописать. |
4 июл 19, 16:36 [21920922] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
Если честно - с HAVING у меня сложно. Я до этого был однокнопочным админом, а тут пошла жара на новом месте) В данном случае какой параметр надо запросить через HAVING ? Ушёл гуглить EXISTS () и HAVING.
До меня создали 3 представления для 1 отчёта. Теперь их уже 7, а объединить мне их не дают - просят новые багофичи к текущему отчёту. Я боюсь потом самоуничтожу что-то, когда дойдёт до 13 view в рамках 1 отчёта. |
||||
4 июл 19, 16:41 [21920936] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Agney, having COUNT(act_type.act_type_id) > 1 |
4 июл 19, 17:21 [21920982] Ответить | Цитировать Сообщить модератору |
Agney Member Откуда: Сообщений: 12 |
Всем спасибо! Пришлось бросить попытки ловить определённое состояние. Пришлось привязаться к стандартным полям и выбирать MAX параметр. Грубо, но пока работает. |
12 июл 19, 12:05 [21925612] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |