2012-08-02 19 views
12

Al momento ho una tabella che sembra qualcosa di simile:SUM (DISTINCT) Sulla base di Altre colonne

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

Che cosa devo fare è ottenere l'SUM della colonna frequenza, ma solo una volta per ogni nome. Ad esempio, ho tre righe di nome John Doe, ciascuna con tasso 8. Ho bisogno che lo SUM di quelle righe sia 8, non 24, quindi conta il tasso una volta per ciascun gruppo di nomi.

SUM(DISTINCT last_name, first_name) non funzionerebbe, ovviamente, perché sto cercando di sommare la colonna tasso, non i nomi. So quando contando i singoli record, posso usare COUNT(DISTINCT last_name, first_name), e questo è il tipo di comportamento che sto cercando di ottenere da SUM.

Come è possibile ottenere una tariffa di SUM una sola volta per ciascun nome?

Grazie in anticipo!

risposta

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

Modifica

Se si desidera ottenere tutte somma di quelli poco "sums", si otterrà una somma di tutto tavola ..

Select sum(rate) from YourTable 

ma, se per qualche motivo sono diversi (se usi un where, per esempio) e hai bisogno di una somma per quella selezione sopra, solo fare.

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

Ora, mi scuso per non aver menzionato questo nella risposta originale: come potrei, allora, ottenere una somma di tutti quei nuovi 'SUM's? So che potrei farlo in PHP, ma è possibile in quella query ottenere un 'SUM' del risultato? – David

+0

@David, vedere la mia modifica –

+0

Questa seconda query risulta in 'SUM (rate)' senza alcuna influenza 'GROUP BY', e non ho idea del perché. – David

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

Per curiosità, perché hai usato 'CONCAT_WS'? – David

+2

Per raggruppare il nome e il cognome insieme a un separatore. Se lo si desidera per ogni cognome e ogni nome, si eseguirà 'GROUP BY last_name, first_name'. Ciò fornirebbe somme per ogni cognome e ogni nome, non un nome completo. – MetalFrog

+0

Grazie mille, è estremamente utile su altre parti di questa applicazione :) – David

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

È possibile utilizzare qualsiasi dell'esempio di codice sopra fornito dal gruppo con dalla clausola senza alcuna funzione di aggregazione restituirà un record indeterminato per ogni condizione di raggruppamento. È possibile fare riferimento al collegamento http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html per ulteriori letture.

+1

Le risposte di solo collegamento sono male per questo motivo in particolare. Il tuo link è ora rotto – Buggabill

5

David ha detto che ha trovato la sua risposta in quanto tale:

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

Ma quando si fa la GROUP BY nella query interna, io penso che si debba utilizzare le funzioni di aggregazione nella vostra SELECT. Quindi, credo che la risposta è più simile a:

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

ho preso MAX() scegliere un solo "tasso" per un "cognome, first_name" combinazione, ma MIN() dovrebbe funzionare lo stesso, partendo dal presupposto che il "cognome, first_name" ci porta sempre alla stessa "velocità" anche quando accade più volte nella tabella. Questo sembra essere l'assunto originale di David - che per un nome unico vogliamo prendere il rate una sola volta perché sappiamo che sarà lo stesso.

Problemi correlati