Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CASE возвращает табличные значения  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Всем добрый день!

В нашей базе у одного налога может быть несколько кодов.

Возможно ли использовать такую конструкцию CASE:

WHERE ...
AND table1.Налоги_Код IN	(
					CASE table2.[F6]
						WHEN 1 THEN (SELECT TaxID FROM (VALUES(15), (16)) as y1(TaxID))
						WHEN 2 THEN (SELECT TaxID FROM (VALUES(21), (22)) as y1(TaxID))
						WHEN 3 THEN 13
						WHEN 4 THEN (SELECT TaxID FROM (VALUES(17), (18), (19), (20)) as y1(TaxID))
						WHEN 5 THEN 1
						WHEN 6 THEN 14
						WHEN 7 THEN 4
						WHEN 8 THEN (SELECT TaxID FROM (VALUES(23), (24)) as y1(TaxID))

					ELSE NULL END
					)
17 июл 13, 14:38    [14578330]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Eugene_p1,

нет, конечно. CASE - это скалярная функция
17 июл 13, 14:40    [14578342]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
WHERE EXISTS
(
 SELECT *
 FROM(VALUES(1,15),(1,16),(2,21),(2,22),(3,13),(4,17),(4,18),(4,19),(4,20),(5,1),(6,14),(7,4),(8,23),(8,24))T(F6,TaxID)
 WHERE T.F6=table2.[F6] AND T.TaxID=table1.Налоги_Код
)
17 июл 13, 14:50    [14578420]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
iap,

Вот спасибо, интересный приём.

Думаю, я изначально в неправильном направлении писал. Мне нужно было заменить 2-3 кода на 1. В итоге переделал через JOIN:

LEFT JOIN
(SELECT 
			Начислено, 
			Уплачено, 
			CompanyID, 
			Бюджет_Код,
			TaxID=CASE Налоги_Код 
					WHEN 15 THEN 1
					WHEN 16 THEN 1
					WHEN 21 THEN 2
					WHEN 22 THEN 2
					WHEN 13 THEN 3
					WHEN 17 THEN 4
					WHEN 18 THEN 4
					WHEN 19 THEN 4
					WHEN 20 THEN 4
					WHEN 1 THEN 5
					WHEN 4 THEN 7
					WHEN 23 THEN 8
					WHEN 24 THEN 8
					ELSE NULL END 
			FROM [Stats]..[Сведения] st LEFT JOIN [Stats]..[Предприятие] c ON c.Предприятие_Код = st.Предприятие_Код 
			WHERE CompanyID IS NOT NULL
		) s ON s.CompanyID=t1.КодПредпр 
				AND s.TaxID = t1.[F6] 
				AND s.Бюджет_Код=
					(CASE WHEN t1.КодРег = 0 THEN 36 
							ELSE (SELECT Stats_Бюджет_Код FROM ref_Region WHERE RegionID=t1.КодРег AND Stats_Бюджет_Код IS NOT NULL) END) 
17 июл 13, 16:05    [14578957]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
iap,

с Вашим вариантом еще красивее получилось:
LEFT JOIN
(SELECT 
			Начислено, 
			Уплачено, 
			CompanyID, 
			Бюджет_Код,
			TaxID=T.Налоги_Код
			FROM [Stats]..[Сведения] st LEFT JOIN [Stats]..[Предприятие] c ON c.Предприятие_Код = st.Предприятие_Код 
			LEFT JOIN (VALUES(1,15),(1,16),(2,21),(2,22),(3,13),(4,17),(4,18),(4,19),(4,20),(5,1),(6,14),(7,4),(8,23),(8,24)) T(F6,Налоги_Код) ON T.Налоги_Код=st.Налоги_Код
			WHERE CompanyID IS NOT NULL
		) s ON s.CompanyID=t1.КодПредпр 
				AND s.TaxID = t1.[F6] 
				AND s.Бюджет_Код=
					(CASE WHEN t1.КодРег = 0 THEN 36 
							ELSE (SELECT Stats_Бюджет_Код FROM ref_Region WHERE RegionID=t1.КодРег AND Stats_Бюджет_Код IS NOT NULL) END) 

Спасибо еще раз!
:)
17 июл 13, 16:10    [14579002]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Eugene_p1,

ELSE NULL можно было и не писать
17 июл 13, 16:11    [14579011]     Ответить | Цитировать Сообщить модератору
 Re: CASE возвращает табличные значения  [new]
=)8)
Guest
Eugene_p1
...
				AND s.Бюджет_Код=
					(CASE WHEN t1.КодРег = 0 THEN 36 
							ELSE (SELECT Stats_Бюджет_Код FROM ref_Region WHERE RegionID=t1.КодРег AND Stats_Бюджет_Код IS NOT NULL) END) 
Если последний подзапрос вернет несколько подходящих значений Stats_Бюджет_Код, весь запрос упадет с ошибкой...
17 июл 13, 20:02    [14580171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить