2015-03-24 2 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 ....) исправит комбинаторный взрыв, который исходит от соединения.

(Pro совет:.. Использовать Явные вместо устаревшей table,table WHERE форме присоединения легче читать)

+0

Великого объяснения, я не использовал первый один, но второй один работал, как и ожидалось. Можете ли вы остановиться на комбинаторном взрыве. Любой хороший ресурс, объясняющий это? – fanbondi

Смежные вопросы