Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CASE...WHEN...THEN не отрабатывает несколько условий / 13 сообщений из 13, страница 1 из 1
04.07.2019, 12:15
    #39833759
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Добрый день!
У меня не достаточно опыта, чтобы сделать то, что вроде бы сделать просто. Больше 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 - при большем количестве связей выгрузка пустая. Тут минимальное количество связи всех таблиц между собой.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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? Извините, возможно за тривиальный вопрос.
...
Рейтинг: 0 / 0
04.07.2019, 12:36
    #39833777
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Формально - case правильный, разве только ELSE не хватает. Кто будет исполнять все прочие заявки?

Но бизнеслогично его тока ты могешь проверить.
...
Рейтинг: 0 / 0
04.07.2019, 12:49
    #39833788
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
aleks222,

Т.е. такой COUNT может отрабатывать?
По моей задумке (я забыл про ELSE) второй WHEN ловил большинство других вариантов. Но теперь я понял, что надо пересчитать. Уже наводка.
...
Рейтинг: 0 / 0
04.07.2019, 13:08
    #39833795
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Во втором IN() 1363 написано дважды. Опечатка?

Вы используете общее количество записей в запросе для act_type.act_type_id IS NOT NULL - это так и задумывалось?
Со стороны-то трудно судить об этом...
...
Рейтинг: 0 / 0
04.07.2019, 13:47
    #39833818
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
iap,

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

Основное что я ловлю - время операции.
...
Рейтинг: 0 / 0
04.07.2019, 13:49
    #39833821
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Не могу сделать вложение - PNG 38 кб
...
Рейтинг: 0 / 0
04.07.2019, 14:01
    #39833834
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Agney,

(1363, 1363, 1364)

повторяется.
...
Рейтинг: 0 / 0
04.07.2019, 16:19
    #39833922
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Владислав Колосов,

Да, спасибо! Выше я уже написал, что это была опечатка при переносе на форум. На код она не влияла.

Сейчас код выглядит так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
/****** Скрипт для команды 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)
...
Рейтинг: 0 / 0
04.07.2019, 16:27
    #39833928
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Agney,

я бы сделал тремя запросами с объединением результатов. Вы в WHEN пишете то, что надо писать в EXISTS () и HAVING.
...
Рейтинг: 0 / 0
04.07.2019, 16:36
    #39833938
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Как бы прописать в
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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]



Если
Код: sql
1.
act_type_n = 'Attachment Added'


то берём время act_reg.date_actioned
Т.е. если тип действия Attachment Added (act_type_id = 5000054), то надо вывести его act_reg.date_actioned.

В WHEN столько всего засунуто, что уже не знаю как его прописать.
...
Рейтинг: 0 / 0
04.07.2019, 16:41
    #39833947
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Владислав КолосовAgney,

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

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


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

я бы сделал тремя запросами с объединением результатов.
До меня создали 3 представления для 1 отчёта. Теперь их уже 7, а объединить мне их не дают - просят новые багофичи к текущему отчёту. Я боюсь потом самоуничтожу что-то, когда дойдёт до 13 view в рамках 1 отчёта.
...
Рейтинг: 0 / 0
04.07.2019, 17:21
    #39833973
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Agney,

having COUNT(act_type.act_type_id) > 1
...
Рейтинг: 0 / 0
12.07.2019, 12:05
    #39836762
Agney
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE...WHEN...THEN не отрабатывает несколько условий
Всем спасибо! Пришлось бросить попытки ловить определённое состояние. Пришлось привязаться к стандартным полям и выбирать MAX параметр. Грубо, но пока работает.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CASE...WHEN...THEN не отрабатывает несколько условий / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]