2012-08-02 18 views
12

Actualmente tengo una tabla que se ve algo como esto:SUM (DISTINCT) Sobre la base de columnas Otros

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

Lo que necesito hacer es conseguir la SUM de la columna de la tasa, pero sólo una vez para cada nombre. Por ejemplo, tengo tres filas de nombre John Doe, cada una con una tasa 8. Necesito que SUM de esas filas sea 8, no 24, por lo que cuenta la tasa una vez para cada grupo de nombres.

SUM(DISTINCT last_name, first_name) no funcionaría, por supuesto, porque estoy tratando de sumar la columna de la tasa, no los nombres. Sé que al contar los registros individuales, puedo usar COUNT(DISTINCT last_name, first_name), y ese es el tipo de comportamiento que intento obtener de SUM.

¿Cómo puedo obtener solo SUM una tasa para cada nombre?

¡Gracias de antemano!

Respuesta

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

Editar

Si desea obtener toda suma de esos pequeños "sums", obtendrá una suma de toda la tabla ..

Select sum(rate) from YourTable 

pero, si por alguna razón son diferentes (si usa un where, por ejemplo) y necesita una suma para seleccionar arriba, solo hacer

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

Ahora, me disculpo por no mencionar esto en la respuesta original: ¿cómo podría, entonces, obtener una suma de todos esos nuevos 'SUM's? Sé que podría hacerlo en PHP, pero ¿es posible en esa consulta obtener una 'SUMA' del resultado? – David

+0

@David, ver mi edición –

+0

Esa segunda consulta da como resultado 'SUM (rate)' sin ninguna influencia 'GROUP BY', y no tengo idea de por qué. – David

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

Por curiosidad, ¿por qué usaste 'CONCAT_WS'? – David

+2

Para agrupar el nombre y apellido junto con un separador. Si lo quiere por cada apellido y cada nombre, haría 'GROUP BY last_name, first_name'. Eso proporcionaría sumas para cada apellido y cada nombre, no un nombre completo. – MetalFrog

+0

Muchas gracias, eso es extremadamente útil en otras partes de esta aplicación :) – David

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

Puede utilizar cualquiera de la muestra el código de seguridad proporcionado ya con el grupo por la cláusula sin ninguna función de agregado devolverá un indeterminado un registro para cada condición de agrupación. Puede consultar el enlace http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html para obtener más información.

+1

Las respuestas solo de enlace son malas por este motivo en particular. Tu enlace ahora está roto. – Buggabill

5

David dijo que encontró su respuesta como tal:

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

Pero cuando lo hace el GROUP BY en la consulta interna, yo creo que hay que utilizar funciones de agregado en su SELECT. Por lo tanto, creo que la respuesta es más como:

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

Tomé MAX() para recoger sólo una "tasa" para un "apellidos, nombre apellido" combinación pero MIN() debería funcionar de la misma, en el supuesto de que el "apellidos, nombre apellido" siempre nos lleva a la misma "tasa" incluso cuando ocurre varias veces en la tabla. Esta parece ser la suposición original de David: que para un nombre único queremos obtener la tasa solo una vez porque sabemos que será la misma.

Cuestiones relacionadas