Я пытаюсь произвести вычисления с помощью оператора SQL. Я пытаюсь подсчитать общую сумму в столбце invoice.total для каждого клиента. Я создал следующее заявление:

SELECT customers.firstname, customers.lastname, customers.status, SUM(invoice.total) AS total 
FROM customers
INNER JOIN invoice
ON customers.id=invoice.id;

Когда я запускаю это, я получаю общую сумму в таблице. У меня 15 разных клиентов в этой таблице, но я получаю только имя первого клиента и общее количество всех клиентов. Что я делаю не так?

2
John 28 Фев 2016 в 09:51

4 ответа

Лучший ответ

Во-первых, вам нужно сгруппировать данные, если вы хотите получить агрегированные результаты:

SELECT customers.firstname, customers.lastname, customers.status, SUM(invoice.total) AS total 
FROM customers
INNER JOIN invoice
    ON customers.id=invoice.id
GROUP BY customers.firstname, customers.lastname, customers.status;

Во-вторых, вы уверены, что присоединяетесь к таблице по правильным полям? Правильный ли столбец invoice.id? Я ожидал бы, что invoice.id будет первичным ключом для таблицы, и вместо этого я ожидал бы другой столбец для внешнего ключа, например invoice.customerid. Пожалуйста, дважды проверьте правильность.

ОБНОВЛЕНИЕ: как уже упоминалось в комментариях, если у вас есть два клиента с одинаковыми именем, фамилией и статусом, данные будут сгруппированы неправильно. В этом случае вам нужно добавить уникальное поле (например, customers.id) в операторы SELECT и GROUP BY.

2
dotnetom 28 Фев 2016 в 07:21

Вам нужно добавить Group By с именами столбцов в ваш запрос.

1
HeinrichG 28 Фев 2016 в 07:10

Используйте предложение group by в своем запросе или вы можете использовать общее табличное выражение, чтобы получить сумму записей по клиенту, а затем выполнить внутреннее соединение с таблицей клиентов.

1
Sagar 28 Фев 2016 в 07:00

Вы должны добавить группу по клиенту (например, свойство id). Если вы хотите, чтобы имя и фамилия были выбраны, вам также придется группировать по ним.

2
Jakub Szumiato 28 Фев 2016 в 06:56