2017-02-10 9 views
0

Мне нужно извлечь информацию из таблицы и рассчитать комиссию продавца.SQL Server: column is Invalid

SELECT 
    s.st_staffno as "Staff Number", s.st_name as "Staff Name", 
    s.st_position as "Job Title", 
    COUNT(r.ren_moveindate) as "Properties Rented", 
    s.st_salary * s.st_commperc/100 as "Commission" 
FROM 
    dbo.staff s 
INNER JOIN 
    dbo.rental r ON (s.st_staffno = r.ren_st_staffno) 
WHERE 
    s.st_commperc != NULL 
GROUP BY 
    s.st_staffno, s.st_name, s.st_position; 

Но я получаю следующие ошибки:

Msg 8120, уровень 16, состояние 1, строка 2
Колонка 'dbo.staff.st_salary' недопустим в списке выбора, потому что это не содержащихся ни в агрегатной функции, ни в предложении GROUP BY.

Msg 8120, уровень 16, состояние 1, строка 2
Колонка «dbo.staff.st_commperc» недопустим в списке выбора, поскольку он не содержится ни в статистической функции или предложения GROUP BY.

+3

Сообщение об ошибке очень Чисто. Либо используйте функцию агрегации (может быть 'SUM') в' s.st_salary * s.st_commperc/100' или группу по этим столбцам тоже, зависит от результата, который вы хотите – Lamak

+2

Предложение Where должно быть «WHERE s.st_commperc IS NOT NULL " –

+0

@ GordonBell хороший улов – Lamak

ответ

0

У вас есть несколько ошибок. Я думаю, что вы намерены:

SELECT s.st_staffno as "Staff Number", s.st_name as "Staff Name", 
     s.st_position as "Job Title", 
     COUNT(r.ren_moveindate) as "Properties Rented", 
     SUM(s.st_salary * s.st_commperc)/100.0 as "Commission" 
FROM dbo.staff s INNER JOIN 
    dbo.rental r 
    ON s.st_staffno = r.ren_st_staffno 
WHERE s.st_commperc IS NOT NULL 
Group BY s.st_staffno, s.st_name, s.st_position; 
0

Как в сообщение об ошибке, вы не st_salary И st_commperc В GROUP BY и Ной в агрегированной функции, так что вы должны добавить в группу по

SELECT s.st_staffno as "Staff Number", s.st_name as "Staff Name", s.st_position as "Job Title", 
COUNT(r.ren_moveindate) as "Properties Rented", s.st_salary * s.st_commperc/100 as "Commission" 
FROM dbo.staff s 
INNER JOIN dbo.rental r 
ON (s.st_staffno = r.ren_st_staffno) 
WHERE s.st_commperc != NULL 
Group BY s.st_staffno, s.st_name, s.st_position,s.st_salary, s.st_commperc; 

или использовать aggeìregate функцию например: сумма

SELECT s.st_staffno as "Staff Number", s.st_name as "Staff Name", s.st_position as "Job Title", 
COUNT(r.ren_moveindate) as "Properties Rented", sum(s.st_salary * s.st_commperc/100) as "Commission" 
FROM dbo.staff s 
INNER JOIN dbo.rental r 
ON (s.st_staffno = r.ren_st_staffno) 
WHERE s.st_commperc != NULL 
Group BY s.st_staffno, s.st_name, s.st_position; 
0

Вы должны заменить WHERE s.st_commperc = NULL по ГДЕ s.st_commperc НЕ NULL и включают в агрегатной функции SUM(), чтобы получить общую комиссию: SUM (s.st_salary * s.st_commperc)/100 как «Комиссия»

Смежные вопросы