Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CASE...WHEN...THEN не отрабатывает несколько условий  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
aleks222
Member

Откуда:
Сообщений: 696
Формально - case правильный, разве только ELSE не хватает. Кто будет исполнять все прочие заявки?

Но бизнеслогично его тока ты могешь проверить.
4 июл 19, 12:36    [21920671]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Agney
Member

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

Т.е. такой COUNT может отрабатывать?
По моей задумке (я забыл про ELSE) второй WHEN ловил большинство других вариантов. Но теперь я понял, что надо пересчитать. Уже наводка.
4 июл 19, 12:49    [21920686]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
iap
Member

Откуда: Москва
Сообщений: 46778
Во втором IN() 1363 написано дважды. Опечатка?

Вы используете общее количество записей в запросе для act_type.act_type_id IS NOT NULL - это так и задумывалось?
Со стороны-то трудно судить об этом...
4 июл 19, 13:08    [21920696]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Agney
Member

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

Да, опечатка для форума. Я несколько вариаций уже пробовал и уже на форум немного дописал.
Приложил скриншот.
Крайний справа столбик имеет названия, но не всегда - иногда пусто (NULL), но при этом тип действия нужный мне - первый столбик. Вот чтобы не гадать - делаю исключение из общего списка.
Трудно передать это.
У меня составной отчёт из 6 view, которые я ещё не успел объединить, а требуют доработку уже существующих.

Основное что я ловлю - время операции.
4 июл 19, 13:47    [21920736]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Agney
Member

Откуда:
Сообщений: 12
Не могу сделать вложение - PNG 38 кб

К сообщению приложен файл. Размер - 38Kb
4 июл 19, 13:49    [21920739]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Владислав Колосов
Member

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

(1363, 1363, 1364)

повторяется.
4 июл 19, 14:01    [21920753]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Владислав Колосов
Member

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

я бы сделал тремя запросами с объединением результатов. Вы в WHEN пишете то, что надо писать в EXISTS () и HAVING.
4 июл 19, 16:27    [21920907]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Agney
Member

Откуда:
Сообщений: 12
Владислав Колосов
Agney,

я бы сделал тремя запросами с объединением результатов. Вы в WHEN пишете то, что надо писать в EXISTS () и HAVING.


Если честно - с HAVING у меня сложно. Я до этого был однокнопочным админом, а тут пошла жара на новом месте)
В данном случае какой параметр надо запросить через HAVING ?
Ушёл гуглить EXISTS () и HAVING.


Владислав Колосов
Agney,

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

До меня создали 3 представления для 1 отчёта. Теперь их уже 7, а объединить мне их не дают - просят новые багофичи к текущему отчёту. Я боюсь потом самоуничтожу что-то, когда дойдёт до 13 view в рамках 1 отчёта.
4 июл 19, 16:41    [21920936]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Владислав Колосов
Member

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

having COUNT(act_type.act_type_id) > 1
4 июл 19, 17:21    [21920982]     Ответить | Цитировать Сообщить модератору
 Re: CASE...WHEN...THEN не отрабатывает несколько условий  [new]
Agney
Member

Откуда:
Сообщений: 12
Всем спасибо! Пришлось бросить попытки ловить определённое состояние. Пришлось привязаться к стандартным полям и выбирать MAX параметр. Грубо, но пока работает.
12 июл 19, 12:05    [21925612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить