Задание 11
Выдать статистику по приёму 1991 года вашего государства по всем категориям обучения и городам. Отчёт должен начинаться с заголовка и цифры - общего количества записей по запросу (по приёму 91-го года). Далее совокупность таблиц, где каждая таблица начинается с заголовка: <название категории обучения> - <цифра>, не равная нулю, а заканчивается перечнем названий городов с цифрами, не равными нулю.
Запрос:
CREATE PROCEDURE lab8_p11 AS
BEGIN
DECLARE @kat1 CHAR(20), @kat2 CHAR(20), @g CHAR(20), @it1 INT, @it2 INT, @r INT
SET @r = (SELECT count(*) FROM arm WHERE gp = '91')
PRINT 'Всего учащихся: ' + ltrim(str(@r))
DECLARE cur CURSOR FOR
SELECT kat_obucheniya, count(*)
FROM arm
JOIN kat_obuch ON kat_obuch.cod = kat_obuch_k
WHERE gp = '91'
GROUP BY kat_obucheniya
ORDER BY kat_obucheniya
OPEN cur
FETCH cur INTO @kat1, @it1
EXECUTE @r = fetch_check
IF(@r = 1)
BEGIN
CLOSE cur
RETURN
END
DECLARE cur2 CURSOR FOR
SELECT kat_obucheniya, nazvanie_goroda, count(*)
FROM arm
JOIN kat_obuch ON kat_obuch.cod = kat_obuch_k
JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k
WHERE gp = '91'
GROUP BY kat_obucheniya, nazvanie_goroda
ORDER BY kat_obucheniya, nazvanie_goroda
OPEN cur2
FETCH cur2 INTO @kat2, @g, @it2
EXECUTE @r = fetch_check
IF(@r = 1)
BEGIN
CLOSE cur2
RETURN
END
PRINT ''
PRINT @kat1 + ' - ' + ltrim(str(@it1))
PRINT '-------------------------------'
PRINT @g + ' - ' + ltrim(str(@it2))
WHILE(@@fetch_status = 0)
BEGIN
FETCH cur2 INTO @kat2, @g, @it2
WHILE(@kat1 != @kat2)
BEGIN
FETCH cur INTO @kat1, @it1
PRINT ''
PRINT @kat1 + ' - ' + ltrim(str(@it1))
PRINT '-------------------------------'
PRINT @g + ' - ' + ltrim(str(@it2))
FETCH cur2 INTO @kat2, @g, @it2
END
IF(@@fetch_status = -1) BREAK
PRINT @g + ' - ' + ltrim(str(@it2))
END
CLOSE cur
DEALLOCATE cur
CLOSE cur2
DEALLOCATE cur2
RETURN
END
Результат:
Задание 12
Выдать статистику по специальностям и городам вашего государства. Отчёт должен начинаться заголовком и цифрой - общим количеством записей по запросу. Далее совокупность таблиц, где каждая таблица начинается с заголовка: СПЕЦИАЛЬНОСТЬ <шифр> - ВСЕГО <цифра>, не равная нулю, а заканчивается перечнем названий городов с цифрами, не равными нулю.
Запрос:
CREATE PROCEDURE lab8_p12 AS
BEGIN
DECLARE @sp1 CHAR(20), @sp2 CHAR(20), @g CHAR(20), @it1 INT, @it2 INT, @r INT
SET @r = (SELECT count(*) FROM arm)
PRINT 'Всего учащихся: ' + ltrim(str(@r))
DECLARE cur CURSOR FOR
SELECT spec, count(*)
FROM arm
GROUP BY spec
ORDER BY spec
OPEN cur
FETCH cur INTO @sp1, @it1
EXECUTE @r = fetch_check
IF(@r = 1)
BEGIN
CLOSE cur
RETURN
END
DECLARE cur2 CURSOR FOR
SELECT spec, nazvanie_goroda, count(*)
FROM arm
JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k
GROUP BY spec, nazvanie_goroda
ORDER BY spec, nazvanie_goroda
OPEN cur2
FETCH cur2 INTO @sp2, @g, @it2
EXECUTE @r = fetch_check
IF(@r = 1)
BEGIN
CLOSE cur2
RETURN
END
PRINT ''
PRINT @sp1 + ' - ' + ltrim(str(@it1))
PRINT '-------------------------------'
PRINT @g + ' - ' + ltrim(str(@it2))
WHILE(@@fetch_status = 0)
BEGIN
FETCH cur2 INTO @sp2, @g, @it2
WHILE(@sp1 != @sp2)
BEGIN
FETCH cur INTO @sp1, @it1
PRINT ''
PRINT @sp1 + ' - ' + ltrim(str(@it1))
PRINT '-------------------------------'
PRINT @g + ' - ' + ltrim(str(@it2))
FETCH cur2 INTO @sp2, @g, @it2
END
IF(@@fetch_status = -1) BREAK
PRINT @g + ' - ' + ltrim(str(@it2))
END
CLOSE cur
DEALLOCATE cur
CLOSE cur2
DEALLOCATE cur2
RETURN
END
Результат: