Member 13581623 Ответов: 2

7. выведите имя сотрудника, его зарплату и комиссионные, умноженные на 2. если сотрудник не получает комиссионных, то выведите их как "без комиссии". Назовите столбцы соответствующим образом


Msg 512, Уровень 16, Состояние 1, Строка 1
Подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за=, !=, <, <= , >, >= или когда подзапрос используется в качестве выражения.

Что я уже пробовал:

выбирать
first_name,зарплата,
случай, когда (комиссия*2)>0 затем (выберите (комиссия*2) из сотрудников)
еще "nocommission"
конец
от сотрудников

2 Ответов

Рейтинг:
2

Bryian Tan

Какого сотрудника пытается выбрать запрос? (выберите (комиссия*2) из сотрудников) -> Это может быть 1, 10, 100, 1000 записей. Попробуйте что-нибудь вроде приведенного ниже.

select
e1.first_name,e1.salary,
case 
	when (e1.commission*2)>0 then (select TOP 1 (e2.commission*2) from employees e2 WHERE e1.EmployeeId = e2.EmployeeId)
	else 'nocommission'
end
from employees e1


Рейтинг:
0

Dave Kreskowiak

Ваш подзапрос возвращает комиссию * 2 для каждой записи в таблице сотрудников. Он должен возвращать только одну запись, а не все из них. Похоже, что у вас нигде не указан первичный ключ, поэтому вы действительно не можете использовать подзапрос.

Но зачем вы вообще делаете подзапрос? Ваше заявление по делу на самом деле не имеет никакого смысла. Если комиссия * 2 больше 0, то сделайте выбор? Почему? Весь ваш запрос должен быть только таким:

SELECT first_name, salary, commission * 2 AS commission FROM employees

Конечно, это означает, что каждая комиссия, равная нулю, вернет 0, а не "nocommission". Столбец всегда должен возвращать только один тип данных, а не числовое значение для одной записи и значение char для другой.

Конечно, вы могли бы.
SELECT first_name, salary,
CASE
    WHEN commission > 0 THEN commission * 2
    ELSE 'No Commission'
END
FROM employees