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
одну ставку для каждого имени?
Спасибо заранее!
Ответы
Ответ 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 для дальнейшего чтения.