Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 условный оператор  [new]
Я
Guest
помогите пожалуйста начинающему мне есть вот такой вот скриптик написанный мною.
ALTER PROCEDURE dbo.BALLEGE 
	@SID int,
	@FYEAR int,
	@LYEAR int
AS

SELECT
	SB.name as subj,
	sum(case 
		when E.value=5
			then 1 
			else 0 end) as cnt5,
	sum(case 
		when E.value=4
			then 1
			else 0 end) as cnt4,
	sum(case 
		when E.value=3
			then 1
			else 0 end) as cnt3,
	sum(case 
		when E.value=2
			then 1
			else 0 end) as cnt2,
	sum(case 
		when E.value=1
			then 1
			else 0 end) as cnt1,
	avg(E.Value*1.0) as GPA
FROM
	person P
	inner join exam E ON P.ID=E.ID_Person
	inner join subject SB ON SB.id=E.ID_Subject

WHERE
	YEAR(E.Date_Exam)<=@LYEAR
and YEAR(E.Date_Exam)>=@FYEAR
and P.ID_School=@SID
GROUP BY
	SB.name
UNION
SELECT
	'ИТОГ' as subj,
	sum(case 
		when E.value=5
			then 1
			else 0 end) as cnt5,
	sum(case 
		when E.value=4
			then 1
			else 0 end) as cnt4,
	sum(case 
		when E.value=3
			then 1
			else 0 end) as cnt3,
	sum(case 
		when E.value=2
			then 1
			else 0 end) as cnt2,
	sum(case 
		when E.value=1
			then 1
			else 0 end) as cnt1,
	avg(E.Value*1.0) as GPA
FROM
	person P
	inner join exam E ON P.ID=E.ID_Person
WHERE
	YEAR(E.Date_Exam)<=@LYEAR
and YEAR(E.Date_Exam)>=@FYEAR
and P.ID_School=@SID
ORDER BY
	cnt5

он подтягивает кол-во каждой из оценок по каждому из предметов. вопрос в том что хочется ещё сделать фильтр по школе. точнее, хочется при отсутвии указания школы (@SID NULL) это условие игнорилась и бралась статистика по всем школам. самое лобовое решение это ещё в начале процедуры проанализировать этот @SID и просто два скрипта написать отличающихся лишь наличием/отсутствием условия проверки школы. но нифига же так некрасиво. Есть какие-то более изящные методы решения? была идея попытаться выгрузить в какой-нить массив все ID школ если искомый не указан, но SQL не знает массивов как таковых, тем более динамических (ведь хз сколько у нас школ), курсоры сюда тоже не привертеть вроде бы. Вот. не то чтобы решения прошу, прошу сказать это вообще адекватными методами решается?
1 июл 16, 13:02    [19359047]     Ответить | Цитировать Сообщить модератору
 Re: условный оператор  [new]
Мимоходящий
Guest
Я,

Некрасивый вариант может быть быстрее, а передать массив можно через строку.
1 июл 16, 13:12    [19359162]     Ответить | Цитировать Сообщить модератору
 Re: условный оператор  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
SELECT
	case when grouping(SB.name) = 0 then SB.name else 'ИТОГО' end as subj,
	sum(case 
		when E.value=5
			then 1 
			else 0 end) as cnt5,
	sum(case 
		when E.value=4
			then 1
			else 0 end) as cnt4,
	sum(case 
		when E.value=3
			then 1
			else 0 end) as cnt3,
	sum(case 
		when E.value=2
			then 1
			else 0 end) as cnt2,
	sum(case 
		when E.value=1
			then 1
			else 0 end) as cnt1,
	avg(E.Value*1.0) as GPA
FROM
	person P
	inner join exam E ON P.ID=E.ID_Person
	inner join subject SB ON SB.id=E.ID_Subject

WHERE
	YEAR(E.Date_Exam)<=@LYEAR
and YEAR(E.Date_Exam)>=@FYEAR
and (@SID is null or P.ID_School=@SID)
GROUP BY
	grouping sets (SB.name, ());
1 июл 16, 13:17    [19359195]     Ответить | Цитировать Сообщить модератору
 Re: условный оператор  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
WHERE E.Date_Exam>=STR(@FYEAR) AND E.Date_Exam<STR(@LYEAR+1)
  AND (@SID IS NULL OR P.ID_School=@SID)
1 июл 16, 13:18    [19359202]     Ответить | Цитировать Сообщить модератору
 Re: условный оператор  [new]
Я
Guest
Афигенски! Спасибо! ни за что бы не догадался, так перестроить условие в WHERE.
1 июл 16, 13:27    [19359281]     Ответить | Цитировать Сообщить модератору
 Re: условный оператор  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Я
Афигенски! Спасибо! ни за что бы не догадался, так перестроить условие в WHERE.
Вот только накладывать ограничение на функцию от поля - моветон. Не SARGable
1 июл 16, 14:08    [19359565]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить