Подтвердить что ты не робот

SUM (DISTINCT) на основе других столбцов

В настоящее время у меня есть таблица, которая выглядит примерно так:

+------+-------+------------+------------+
| id   | rate  | first_name | last_name  |
+------+-------+------------+------------+

Что мне нужно сделать, это получить SUM столбца скорости, но только один раз для каждого имени. Например, у меня есть три строки имени Джон Доу, каждый со скоростью 8. Мне нужно, чтобы SUM этих строк составлял 8, а не 24, поэтому он рассчитывает скорость один раз для каждой группы имен.

SUM(DISTINCT last_name, first_name) не будет работать, конечно, потому что я пытаюсь суммировать столбец скорости, а не имена. Я знаю при подсчете отдельных записей, я могу использовать COUNT(DISTINCT last_name, first_name), и это тип поведения, который я пытаюсь получить от SUM.

Как я могу получить только SUM одну ставку для каждого имени?

Спасибо заранее!

4b9b3361

Ответ 1

select sum (rate)
from yourTable
group by first_name, last_name

Edit

Если вы хотите получить всю сумму этих маленьких "sums", вы получите сумму всей таблицы.

Select sum(rate) from YourTable

но если по какой-то причине есть разные (если вы используете, например, where), и вам нужна сумма для этого выше, просто сделайте.

select sum(SumGrouped) from 
(    select sum (rate) as 'SumGrouped'
    from yourTable
    group by first_name, last_name) T1

Ответ 2

Дэвид сказал, что нашел свой ответ как таковой:

SELECT SUM(rate) FROM (SELECT * FROM records GROUP BY last_name, first_name) T1

Но когда вы делаете GROUP BY во внутреннем запросе, я думаю, вам нужно использовать агрегатные функции в вашем SELECT. Итак, я думаю, что ответ больше похож:

SELECT SUM(rate) FROM (SELECT MAX(rate) AS rate FROM records GROUP BY last_name, first_name) T1

Я выбрал MAX() для выбора только одной "ставки" для комбинации "last_name, first_name", но MIN() должен работать одинаково, считая, что "last_name, first_name" всегда приводит нас к той же "ставке" даже когда это происходит несколько раз в таблице. Похоже, что исходное предположение Дэвида - это то, что для уникального имени мы хотим получить скорость только один раз, потому что знаем, что это будет одно и то же.

Ответ 3

SELECT SUM(rate)
FROM [TABLE] 
GROUP BY first_name, last_name;

Ответ 4

SELECT SUM(rate)
FROM [TABLE] 
GROUP BY CONCAT_WS(' ', first_name, last_name);

Ответ 5

Вы можете использовать любой из приведенных выше примеров кода, поскольку с условием group by без какой-либо агрегатной функции будет возвращена неопределенная одна запись для каждого условия группировки. Вы можете сослаться на http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html для дальнейшего чтения.