Проблема с создание функции SQL-SERVER
Мне необходимо написать функцию, которая делает следующее: Определяет тип выпусков заданного журнала в зависимости от количества публикаций в нем. Если количество публикаций больше 2 и меньше 4, тип — насыщенный, если меньше или равно 2, тип — ненасыщенный, если больше или равно 4, тип — перенасыщенный. Результат примерно такой:
номер | тип | кол-во публикаций
Выпуск№1 | ненасыщенный | 2
Выпуск№2 | насыщенный | 3
Выпуск№3 | насыщенный | 3
Выпуск№4 | перенасыщенный | 5
Выпуск№5 | перенасыщенный | 6
Выпуск№6 | ненасыщенный | 1
Таблицы создаются следующим образом
CREATE table Журналы(
id_журнала INT identity PRIMARY KEY ,
Название VarChar(100) NOT NULL,
Издатель VArChar(100) NOT NULL
);
CREATE table Выпуски_журналов(
Индентификатор_выпуска INT identity PRIMARY KEY,
id_журнала INT references Журналы,
Номер_выпуска INT NOT NULL ,
Год INT
);
CREATE table Публикации(
Код_публикации INT identity PRIMARY KEY,
Индентификатор_выпуска int references Выпуски_журналов,
Название_публикации VArChar(100) NOT NULL ,
Страницы INT check (Страницы>=1 and Страницы<=15)
);
CREATE table Авторы(
id_автора INT identity PRIMARY KEY,
ФИО VArChar(100) NOT NULL ,
Дата_рождения DATE,
Пол VArChar(100)
);
CREATE table АвторПубликаций(
Код_публикации int references Публикации,
id_автора int references Авторы
);
Я пробовал создать данную функцию
create function c(@dep int) returns int as
begin
return (select count(Код_публикации) from Журналы,Выпуски_журналов,Публикации
where (Журналы.id_журнала=Выпуски_журналов.id_журнала and Выпуски_журналов.Индентификатор_выпуска=Публикации.Индентификатор_выпуска) and Журналы.id_журнала = @dep
group by Номер_выпуска);
end;
go
create function func(@dep int) returns varchar(45) as
begin
if ([dbo].[c](@dep)) >= 4 return ('перенасыщенный');
else if ([dbo].[c](@dep)) <= 2 return ('ненасыщенный');
else return ('насыщенный');
return '0';
end;
И если вам не тяжело, вы не могли бы мне объяснить, как правильно вызывать функцию в SQl-SERVER
Ответы (1 шт):
У меня хорошее настроение, так что ловите :)
Сначала почистим за собой для повторных запусков:
--для тестов
USE tempdb;
GO
--чистим для перезапуска и отладки
IF OBJECT_ID('PubCnt', 'FN') IS NOT NULL DROP FUNCTION PubCnt
IF OBJECT_ID('PubScore', 'FN') IS NOT NULL DROP FUNCTION PubScore
GO
Теперь создаём наши 2 функции, на самом деле можно было и одной обойтись...
GO
--функция подсчёта публикаций(хотя как по мне - это лишний шаг)
CREATE FUNCTION PubCnt(@dep INT) RETURNS INT AS
BEGIN
RETURN (
SELECT COUNT(*)
FROM Журналы G
JOIN Выпуски_журналов VG ON G.id_журнала = VG.id_журнала
JOIN Публикации P ON VG.Индентификатор_выпуска = P.Индентификатор_выпуска
WHERE G.id_журнала = @dep
)
END
GO
--Интерпретация количества публикаций в строку
CREATE FUNCTION PubScore(@dep INT) RETURNS NVARCHAR(255) AS
BEGIN
DECLARE @Score INT = dbo.PubCnt(@dep)
RETURN (CASE
WHEN @Score >= 4 THEN 'перенасыщенный'
WHEN @Score > 2 THEN 'насыщенный'
WHEN @Score <= 2 THEN 'ненасыщенный'
ELSE 'А что произшло?!?'
END
)
END
GO
Чистим данные, чтобы повторные запуски ничего не ломали, всё в целях отладки
--Чистим и таблички, но на РАБОЧЕЙ БД НЕ ЗАПУСКАТЬ!!!
DELETE FROM Публикации --SELECT * FROM Публикации
DELETE FROM Выпуски_журналов --SELECT * FROM Выпуски_журналов
DELETE FROM Журналы --SELECT * FROM Журналы
GO
Делаем немного тестовых данных, чтобы они +- отражали суть задачи
--Вот теперь добавим немного данных, иначе совсем скучно :)
INSERT Журналы VALUES
(N'Ну нет публикаций', N'Авампоф'),
(N'Парочка есть', N'Авампоф'),
(N'Три тоже неплохо', N'Ичего'),
(N'Уже круть', N'Аничего'),
(N'Перебор', N'ВсякоеБывает')
INSERT Выпуски_журналов
SELECT G.id_журнала, X, 2014+X
FROM Журналы G,(VALUES(1)/*,(2)*/)X(X)
INSERT Публикации
SELECT VG.Индентификатор_выпуска, CA.VP, 10
FROM Журналы G
JOIN Выпуски_журналов VG ON G.id_журнала = VG.id_журнала
CROSS APPLY (
SELECT CONCAT('Any',N)VP FROM(
SELECT ROW_NUMBER()OVER(ORDER BY (SELECT(1)))N
FROM Выпуски_журналов VD
)T WHERE N <=
CASE G.Название WHEN N'Ну нет публикаций' THEN 0
WHEN N'Парочка есть' THEN 2
WHEN N'Три тоже неплохо' THEN 3
WHEN N'Уже круть' THEN 4
WHEN N'Перебор' THEN 5
END
)CA
GO
Ну и проверяем как это всё в итоге работает:
SELECT *, dbo.PubCnt(G.id_журнала)AS PubCnt, dbo.PubScore(G.id_журнала)AS PubScoreDesc
FROM Журналы G
Выглядит примерно так:
| id_журнала | Название | Издатель | Количество публикаций | Резюме |
|---|---|---|---|---|
| 226 | Ну нет публикаций | Авампоф | 0 | ненасыщенный |
| 227 | Парочка есть | Авампоф | 2 | ненасыщенный |
| 228 | Три тоже неплохо | Ичего | 3 | насыщенный |
| 229 | Уже круть | Аничего | 4 | перенасыщенный |
| 230 | Перебор | ВсякоеБывает | 5 | перенасыщенный |