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

Откуда:
Сообщений: 2
Нужна помощь, мозги уже закипают, не могу допилить, суть такова. Имеется база данных, структуру смотрите на рисунке,
для этой базы нужно создать скалярную функцию, которая принимает в качестве параметра название группы и возвращает возраст самого молодого сотрудника, относящегося к данной группе.
В принципе, функцию я написал, но работает без учета параметра названия группы, то есть условие WHERE недоработано, помогите
дописать зависимость, пожалуйста

CREATE DATABASE OTDELCADROV
USE OTDELCADROV
CREATE TABLE CROWDS
(
[Id] INT IDENTITY (1,1) NOT NULL PRIMARY KEY([Id]),
[crowd_name] NCHAR(30) NOT NULL
);

CREATE TABLE Staff_list
(
[Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY([Id]),
[position_name] NCHAR(30) NOT NULL,
[full_time_units_number] INT NOT NULL,
[salary] INT NOT NULL,
[crowd_id] INT NOT NULL,
FOREIGN KEY([crowd_id]) REFERENCES CROWDS([Id])
);

CREATE TABLE Employees_Header
(
[Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY([Id]),
[position_id] INT NOT NULL,
[employment_date] Date NOT NULL,
[dismissal_date] Date NOT NULL,
FOREIGN KEY([position_id]) REFERENCES Staff_list([Id])
);

CREATE TABLE Employees_Details
(
[Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY ([Id]),
[first_name] NCHAR(20) NOT NULL,
[patronymic] NCHAR(20) NOT NULL,
[last_name] NCHAR(30) NOT NULL,
[date_of_birth] DATE NOT NULL,
FOREIGN KEY([Id]) REFERENCES Employees_Header([Id])
);


INSERT INTO [CROWDS] ([crowd_name]) VALUES
('Sales'),
('Supply');

INSERT INTO [Staff_list] ([position_name],[full_time_units_number],[salary],[crowd_id]) VALUES
('worker',3,2000,2),
('manager',2,3000,1),
('saler',2,2500,2),
('seсurity',2,3000,1);

INSERT INTO[Employees_Header]([position_id],[employment_date],[dismissal_date]) VALUES
(1,'2016-02-13','2017-02-13'),
(2,'2000-03-04','2016-12-19'),
(1,'2003-06-05','2010-06-15'),
(3,'2015-09-15','2017-06-14'),
(2,'1999-03-23','2003-09-24'),
(3,'2001-10-07','2004-11-14'),
(4,'2009-07-04','2011-12-13'),
(4,'2005-08-15','2012-09-03');

INSERT INTO [Employees_Details] ([first_name],[patronymic],[last_name],[date_of_birth]) VALUES
('Ivan','Jhonovich','Rasputin','1996-01-12'),
('Jhon','Ivanovich','Belkin','1990-03-22'),
('Julia','Borisovna','Strelnikova','1992-04-10'),
('Alisa','Sergeevna','Lubomir','1986-01-13'),
('Michael','Sergeevich','Chemodanov','1976-07-23'),
('Vera','Alexandrovna','Brezneva','1985-11-24'),
('Lev','Filippovich','Levin','1994-01-10'),
('Alexandr','Sergeevich','Borodach','1987-05-12');

GO
CREATE FUNCTION GetYoung
(@group VARCHAR(6))--Название группы
RETURNS int
BEGIN
RETURN (SELECT DATEDIFF( year,MAX(date_of_birth),GETDATE())FROM Employees_Details,CROWDS WHERE crowd_name=@group)
END

select dbo.GetYoung('Supply');

К сообщению приложен файл. Размер - 29Kb
8 мар 17, 09:26    [20273772]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
aleks2
Guest
CREATE FUNCTION GetYoung( @group VARCHAR(6) )--Название группы
RETURNS int
BEGIN
 RETURN (
   with   ed as ( select * from Employees_Details )
	  , eh as ( select * from Employees_Header )
	  , sl as ( select * from Staff_list )
	  , cr as ( select * from CROWDS )
    SELECT top(1) DATEDIFF( year, ed.date_of_birth, GETDATE() )
      FROM cr 
	       inner join sl on sl.crowd_id = cr.id 
	       inner join eh on eh.position_id = sl.id 
	       inner join ed on ed.id = eh.id 
	  WHERE cr.crowd_name = @group
	  order by ed.date_of_birth asc
 )
END
8 мар 17, 10:26    [20273897]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
aleks2, а для чего нужны CTE в данном примере?
9 мар 17, 12:32    [20277053]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
SQL2008
aleks2, а для чего нужны CTE в данном примере?
Просто красиво! :-)
9 мар 17, 13:00    [20277209]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
лолл
Member

Откуда:
Сообщений: 450
alexeyvg,

ничего красивого и рационального в этом нет. не говоря уже о методе набора - табуляция где придется, регистр букв различается... в общем, в приличных домах за такое канделябром... ну переписывать заставить :)
9 мар 17, 13:17    [20277300]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
aleks2
Guest
лолл
alexeyvg,

ничего красивого и рационального в этом нет. не говоря уже о методе набора - табуляция где придется, регистр букв различается... в общем, в приличных домах за такое канделябром... ну переписывать заставить :)

Ну шо ты понимаешь в колбасных обрезках?
9 мар 17, 14:22    [20277584]     Ответить | Цитировать Сообщить модератору
 Re: Создание скалярной функции  [new]
blablakin
Member

Откуда:
Сообщений: 2
Всё получилось, спасибо большое, правда с СТЕ Studio ругался немного, так что пришлось переписать.Просьба закрыть тему,вопрос решен.
11 мар 17, 09:13    [20284143]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить