2012-12-21 20 views
17

Çalışanların aylık maaşlarına sahip bir listesinin (tablo) bulunduğu bir örnek gördüm. Maaşların bir miktarını yaptım ve ouptput'ta tam olarak aynı tabloyu gördüm! Bu garipti.Neden AGGREGATE FONKSİYONLARI ile GROUP BY'ye ihtiyacımız var?

Burada yapılması gerekenler var; bu ay, çalışan maaşları olarak ne kadar para ödediğimizi bulmak zorundayız. Ben yukarıdaki kodda tarafından grubunu kullanmak istemiyorsanız bir hata alıyorum biliyorum

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

- Bunun için, gösterildiği gibi veri tabanı içerisindeki maaş miktarlarını özetlemek gerekir. Bu anlamadım -

Çalışan tablosundan çalışanı seçiyoruz. SUM() çalışanın tablosundan MonthlySalary sütununu eklemesi gerektiği söylenir. Bu yüzden, doğrudan gruplandırılmalı ve onları gruplamak yerine ve daha sonra bunları eklemek yerine bu sayıları eklemelidir.

Bir insan bunu nasıl yapar? - çalışan masasına bakın ve tüm sayıları ekleyin. Neden onları gruplandırmak ve sonra onları eklemek için sorun çıkardı? Eğer BY Bir GRUP olmazdı tüm sayıları toplamak istiyorsa

+0

Tüm sütunu gruplandırmadan toplamak istiyorsanız, SQL grubu tarafından kullanmayın. SQL grubu, bir kişinin ne yapacağını yapmıyor. SQL'de, gruplara bir şey yapmıyorsanız gruplama bir anlam ifade etmez. –

+0

@EricLeschinski - hangi gruplar? –

+2

Çalışanlar tablosundan EmpID grupları. Bunun yerine bir kişinin ne göre ne yaptığını grup tarafından karşılaştırmak için çalışmakla yerine sormaktadır: bizim istediğimiz ile bunu nasıl hizalandıraca- çalışması ile SQL grup yapar ve: http://stackoverflow.com/questions/7434657/how satır sıralama bağlamında yapılan bir şey olarak "gruplaşma" nin SQL düşünmek öğrenme –

cevap

40

GROUP BY'yi açıklama amacıyla "her biri için" olarak düşünürseniz daha kolay olabilir. Aşağıdaki sorgu:

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

söylüyor: masanız gibi ise

Yani

"Her EmpID bana MonthlySalary en toplamını ver":

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

sonucu:

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

Toplam bir şey yapmıyor gibi görünüyor çünkü bir sayının toplamı bu sayıdır. Öte yandan böyle görünüyordu eğer:

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

sonuç:

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

Sonra iki EmpID 1'ler birlikte Özetle vardır çünkü.Bu açıklamanın yardımcı olup olmadığından emin değiliz, ancak umarım bu, işleri biraz daha açık hale getirir.

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee 

Ancak MySQL beklediğiniz yapamaz yapar:

6

:


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

GROUP BY noktasını her çalışan için ayrı toplam almak olmasıdır.

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

GROUP BY belirtmezseniz, toplam işlevler seçilen tüm kayıtlar üzerinde çalışır. Bu durumda, EmployeeID gibi belirli bir sütunu seçmek de mantıklı değildir. Çalışan başına toplamlar istersiniz, bu durumda çalışan kimliğini ve gruba göre çalışanı seçersiniz ya da tüm tabloyu genel olarak görmek isterseniz, çalışan kimliğini ve GROUP BY maddesini dışarıda bırakırsınız.

Sorgunuzda, GROUP BY işaretini bırakırsanız, hangi çalışan kimliğini göstermek istersiniz?

2

üzücü bir şey öneriyorsun sözdizimi destekleyen bir veritabanı olmasıdır. Herkes için MonthlySalary ve rasgele bir çalışanın toplam toplamını döndürür. Ne yazık ki.

Sorunuz SQL sözdizimi hakkında. Cevap, SQL'in nasıl tanımlandığı ve değişmeyeceği yönündedir. Toplama alanlarının SELECT maddesinden belirlenmesi mantıksız değildir, ancak bu dilin nasıl tanımlandığı değildir. Bununla birlikte, soruya biraz sempati duyuyorum. SQL öğrenen pek çok insan, "gruplaşmayı", satırları sıralamak bağlamında yapılmış bir şey olarak düşünür. “ABD'deki şehirleri sıralamak ve bunları devlete göre gruplamak” gibi bir şey. Mantıklı. Ama SQL'de "grup", gerçekten "bir arada tutmak" değil "özetlemek" anlamına gelir.

+0

'Birçok insanı -Hiç-grup tarafından çalışır. “ABD'deki şehirleri sıralamak ve bunları devlete göre gruplamak” gibi bir şey var. ”- SQL'de gruplaşmayı nasıl başarabilirsiniz? – Medorator

İlgili konular