2015-03-24 24 views
0

我有以下表模式,我想要獲得每個類別的金額列的總和和相應類別中的僱員數。MySQL集合函數與分組和加入

表1:員工

id | name | category 
1 | SC | G 1.2 
2 | BK | G 2.2 
3 | LM | G 2.2 

表2:payroll_histories

id | employee_id | amount 
1 | 1   | 1000 
2 | 1   | 500 
3 | 2   | 200 
4 | 2   | 100 
5 | 3   | 300 

輸出表應該是:

category | total | count 
G 1.2 | 1500 | 1 
G 2.2 | 600 | 2 

我曾嘗試下面的總結和分組,但此查詢我無法讓伯爵工作。

查詢

SELECT employee_id, category, SUM(amount) from payroll_histories,employees WHERE employees.id=payroll_histories.employee_id group by category; 

我已經試過了COUNT(類別),但一個也不能正常工作。

回答

4

我相信你在尋求兩個不同的數據摘要。一類是按類別劃分的薪金總額,另一類是員工數,也是按類別劃分的。

您需要使用然後加入單獨的聚合查詢才能獲得該查詢。

SELECT a.category, a.amount, b.cnt 
    FROM (
     SELECT e.category, SUM(p.amount) amount 
      FROM employees e 
      JOIN payroll_histories p ON e.id = p.employee_id 
      GROUP BY e.category 
     ) a 
    JOIN (
      SELECT category, COUNT(*) cnt 
      FROM employees 
      GROUP BY category 
     ) b ON a.category = b.category 

這裏的一般原則是避免試圖只使用一個聚合查詢來聚合多種類型的細節實體。您的金額合計工資總額,而您的計數合計員工。

或者你的具體情況,這個查詢也將工作。但它不能一概而論,也不需要表現良好。

SELECT e.category, SUM(p.amount) amount, COUNT(DISTINCT e.id) cnt 
    FROM employees e 
    JOIN payroll_histories p ON e.id = p.employee_id 
    GROUP BY e.category 

COUNT(DISTINCT ....)將修復來自聯接的組合爆炸。

(臨提示:。使用顯式連接,而不是過時的​​形式加入它更易於閱讀)

+0

很好的解釋,我沒有使用第一個,但第二個和預期一樣。你可以留意組合爆炸。任何好的資源解釋這一點? – fanbondi 2015-03-24 22:15:12