Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве вы
Всем привет , разрабатываю функцию , которая должна вернуть стоимости выполненных заказов для заданного исполнителя. Возникает ошибка описанная выше
Create or Alter function Стоимость_выполенных_заказов
(@Код_исполнителя int)
Returns decimal(18,2)
Begin
Declare @Coast decimal(18,2)
Set @Coast = (Select Код_исполнителя, Полная_стоимость as Стоимость
From Выполнение_работ inner join Заказ_наряд
On Выполнение_работ.Номер_заказа = Заказ_наряд.Номер_заказа
Where Код_исполнителя = 1
)
Return @Coast
end
Go
Select dbo.Стоимость_выполенных_заказов(1) as Стоимость
Скрипт для бд
CREATE TABLE Заказ_наряд
(Номер_заказа int ,
Дата_оформления datetime not null,
Дата_выполнения datetime not null,
Полная_стоимость decimal(18,2) not null
CONSTRAINT PK1 primary key (Номер_заказа)
)
CREATE TABLE Работы
(Код_работы int,
Наименование nvarchar(50) not null,
Стоимость_работы decimal(18,2) not null,
CONSTRAINT PK2 Primary key(Код_работы)
)
CREATE TABLE Исполнитель
(Код_исполнителя int ,
Фамилия nvarchar(50) not null,
Имя nvarchar(50) not null,
Отчество nvarchar(50) null,
Специальность nvarchar(50) not null,
Возраст int not null,
Телефон nvarchar(50) not null,
Дата_приема_на_работу datetime not null,
Зарплата decimal(18,2) not null,
CONSTRAINT PK3 primary key (Код_исполнителя)
)
CREATE TABLE Содержимое_заказа
(Номер_заказа int,
Код_работы int
CONSTRAINT PK4 primary key (Номер_заказа,Код_работы),
CONSTRAINT FK1 FOREIGN KEY (Номер_заказа) REFERENCES Заказ_наряд (Номер_заказа),
CONSTRAINT FK2 FOREIGN KEY (Код_работы) REFERENCES Работы (Код_работы)
)
CREATE TABLE Выполнение_работ
(Номер_заказа int,
Код_работы int,
Код_исполнителя int,
Отметка_о_выполнение bit not null
CONSTRAINT PK5 primary key (Номер_заказа,Код_работы,Код_исполнителя),
CONSTRAINT FK3 FOREIGN KEY (Номер_заказа,Код_работы) REFERENCES Содержимое_заказа (Номер_заказа,Код_работы),
CONSTRAINT FK4 Foreign key (Код_исполнителя) REFERENCES Исполнитель (Код_исполнителя)
)
Ответы (1 шт):
Автор решения: Andrew Nikolaev
→ Ссылка
Тут зависит от постановки задачи, если нужны именно СТОИМОСТИ, то нужна табличная функция, она будет выглядеть так
CREATE OR ALTER FUNCTION Стоимость_выполенных_заказов (@Код_исполнителя INT)
RETURNS @Coasts TABLE (Код_исполнителя INT, Полная_стоимость DECIMAL(18,2))
AS
BEGIN
INSERT @Coasts
SELECT Код_исполнителя, Полная_стоимость
FROM Выполнение_работ
INNER JOIN Заказ_наряд ON Выполнение_работ.Номер_заказа = Заказ_наряд.Номер_заказа
WHERE Код_исполнителя = @Код_исполнителя
RETURN
END
GO
SELECT * FROM dbo.Стоимость_выполенных_заказов(1)
Ну а если интересует общая стоимость по конкретному исполнителю, то можно оставить скалярную функцию, но тогда оставить одно поле и добавить агрегатную функцию с группировкой. Это так:
CREATE OR ALTER FUNCTION Стоимость_выполенных_заказов (@Код_исполнителя INT)
RETURNS DECIMAL(18,2)
AS
BEGIN
DECLARE @Coast DECIMAL(18,2)
SET @Coast =
(
SELECT
SUM(Полная_стоимость)
FROM Выполнение_работ
INNER JOIN Заказ_наряд ON Выполнение_работ.Номер_заказа = Заказ_наряд.Номер_заказа
WHERE Код_исполнителя = @Код_исполнителя
GROUP BY Код_исполнителя -- Это можно не писать, в данном случае не влияет не на что
)
RETURN @Coast
END
GO
SELECT dbo.Стоимость_выполенных_заказов(1) AS Стоимость