Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве вы

Всем привет , разрабатываю функцию , которая должна вернуть стоимости выполненных заказов для заданного исполнителя. Возникает ошибка описанная выше

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 Стоимость
→ Ссылка