2012-12-21 12 views
17

Ho visto un esempio in cui c'era un elenco (tabella) di dipendenti con i loro rispettivi stipendi mensili. Ho fatto una somma degli stipendi e ho visto esattamente lo stesso tavolo nell'output !!! E 'stato stranoPerché abbiamo bisogno di GROUP BY con FUNZIONI AGGREGATE?

Ecco cosa deve essere fatto - dobbiamo scoprire quanti soldi paghiamo questo mese come stipendi dei dipendenti. Per questo, abbiamo bisogno di riassumere la loro quantità di stipendio nel database come indicato -

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee 
GROUP BY EmpID 

So che ottengo un errore se io non uso di gruppo da in codice di cui sopra. Questo è quello che non capisco -

Stiamo selezionando employeeid dalla tabella dei dipendenti. SUM() viene detto che deve aggiungere la colonna MonthlySalary, dalla tabella Employee. Quindi, dovrebbe andare direttamente e aggiungere quei numeri invece di raggrupparli e quindi aggiungerli.

Ecco come lo farebbe una persona: guarda la tabella dei dipendenti e aggiunge tutti i numeri. Perché dovrebbe prendersi la briga di raggrupparli e poi aggiungerli?

+0

Se si desidera sommare l'intera colonna senza raggruppamento, non utilizzare SQL group by. Il gruppo SQL non sta facendo ciò che una persona farebbe. In SQL, il raggruppamento non ha senso se non si sta facendo qualcosa ai gruppi. –

+0

@EricLeschinski - quali gruppi? –

+2

I gruppi di EmpID dalla tabella Employee. Invece di cercare di confrontare il gruppo in base a ciò che fa una persona, chiedi invece: in che modo SQL raggruppa per lavoro e come possiamo allinearlo con ciò che vogliamo: http://stackoverflow.com/questions/7434657/how -segue-group-by-works –

risposta

40

Potrebbe essere più semplice se si pensa a GROUP BY come "per ciascuno" a scopo di spiegazione. La query di seguito:

SELECT empid, SUM (MonthlySalary) 
FROM Employee 
GROUP BY EmpID 

sta dicendo:

"Dammi la somma di MonthlySalary di per ogni EmpID"

Così, se il tavolo si presentava così:

+-----+------------+ 
|empid|MontlySalary| 
+-----+------------+ 
|1 |200   | 
+-----+------------+ 
|2 |300   | 
+-----+------------+ 

risultato:

+-+---+ 
|1|200| 
+-+---+ 
|2|300| 
+-+---+ 

Sum sembra non fare nulla perché la somma di un numero è quel numero. D'altra parte, se si presentava così:

+-----+------------+ 
|empid|MontlySalary| 
+-----+------------+ 
|1 |200   | 
+-----+------------+ 
|1 |300   | 
+-----+------------+ 
|2 |300   | 
+-----+------------+ 

risultato:

+-+---+ 
|1|500| 
+-+---+ 
|2|300| 
+-+---+ 

allora sarebbe perché ci sono due empid 1 di sommare insieme.Non sono sicuro che questa spiegazione sia d'aiuto o meno, ma spero che renda le cose un po 'più chiare.

6

Se si voleva sommare tutti i numeri che non avrebbe un GROUP BY:


SELECT SUM(MonthlySalary) AS TotalSalary 
FROM Employee 
+-----------+ 
|TotalSalary| 
+-----------+ 
|777400  | 
+-----------+ 

Il punto del GROUP BY è che si ottiene un totale separata per ogni dipendente.

+--------+------+ 
|Employee|Salary| 
+--------+------+ 
|John |123400| 
+--------+------+ 
|Frank |413000| 
+--------+------+ 
|Bill |241000| 
+--------+------+ 
1

Se non si specifica GROUP BY, le funzioni di aggregazione operano su tutti i record selezionati. In tal caso, non ha senso selezionare anche una colonna specifica come EmployeeID. O vuoi i totali per dipendente, nel qual caso selezioni l'ID dipendente e il gruppo per dipendente, oppure vuoi un totale sull'intera tabella, in modo da tralasciare l'ID dipendente e la clausola GROUP BY.

Nella vostra domanda, se si omette lo GROUP BY, quale ID dipendente si desidera venga visualizzato?

2

La cosa triste è che c'è un solo database che supporta la sintassi si sta suggerendo:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee 

Tuttavia, MySQL non non fare ciò che vi aspettate. Restituisce la somma complessiva del MonthlySalary per tutti e un EmployeeId arbitrario. Ahimè.

La tua domanda riguarda la sintassi SQL. La risposta è che è stato definito SQL e non cambierà. La determinazione dei campi di aggregazione dalla clausola SELECT non è irragionevole, ma non è come viene definita questa lingua.

Tuttavia, ho qualche simpatia per la domanda. Molte persone che apprendono SQL pensano a "raggruppare" come qualcosa fatto nel contesto dell'ordinamento delle righe. Qualcosa come "ordina le città negli Stati Uniti e raggruppale per stato nell'output". Ha senso. Ma "raggruppare per" in SQL significa davvero "riepilogare per" non "stare insieme".

+0

'Molte persone che imparano SQL pensano a" raggruppare "come qualcosa fatto nel contesto dell'ordinamento delle righe. Qualcosa come "ordina le città negli Stati Uniti e raggruppale per stato nell'output" '- Come puoi ottenere il raggruppamento in SQL allora? – Medorator

Problemi correlati