У меня есть задача выбрать имя, фамилию и ID продавца и посчитать, сколько машин они продали в 2010 году в FireBird 2.5. Вот база данных:

Salesman(salesmanID:int primary key, salesmanName:char(20), SalesmanSurname:char(20))
sale (SalesDate:Date, SalesmanID:foreignkey to salesman)

Я пытался с этим:

select s.count(*), sm.salesmanID, sm.salesmanName, sm.SalesmanSurname
from sale s inner join salesman on s.salesmanID=sm.salesmanID
where SalesDate between '1.1.2010' and '31.12.2010';

И я получаю ошибку:

Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
0
Brane 27 Ноя 2016 в 13:55

3 ответа

Лучший ответ

Работай так

SELECT
    count(*),
    sm.salesmanID,
    sm.salesmanName,
    sm.SalesmanSurname
FROM
    sale s
INNER JOIN salesman sm ON s.salesmanID = sm.salesmanID
WHERE
    s.SalesDate BETWEEN '1.1.2010'
AND '31.12.2010'
GROUP BY
    sm.salesmanID,
    sm.salesmanName,
    sm.SalesmanSurname
1
Faisal 27 Ноя 2016 в 12:39

Сначала сделайте агрегат (вам не хватает группы), а затем присоедините результат к таблице продавца:

select s.salescount, s.salesmanID , sm.salesmanName, sm.SalesmanSurname from
(select count(*) as salescount, salesmanID
FROM sale where SalesDate between '1.1.2010' and '31.12.2010'
    group by salesmanID) as s inner join salesman sm on s.salesmanID=sm.salesmanID
0
Turo 27 Ноя 2016 в 11:21

Вы используете s.count(*), который не является допустимым синтаксисом. Это может быть одной из причин, по которой вы получаете ошибку.

Кроме того, я не вижу sm в качестве псевдонима ни для одной таблицы. Здесь обнаружено несколько проблем.

0
Kumar_Vikas 27 Ноя 2016 в 11:20