2016-01-27 2 views
0

У меня есть SQL-запрос, который получает количество заданий, вес брутто и т. Д. Для разных компаний.Как получить итоги каждого столбца MySQL

В результате в MySQL Workbench выглядит следующим образом: enter image description here

Я хотел бы добавить еще одну строку в нижней части, которая вычисляет общее количество каждого столбца, т.е. общей колонны рабочих мест будет 267. Как я добавить дополнительную строку для итогов?

SQL-запрос:

select 
      c.Name, 
      COUNT(distinct jn.ID) as Jobs, 
      SUM(jn.ActualWeight) as GrossWt, 
      SUM(jpc.AdvisedQty) AS Units_In, 
      SUM(jpd.AdvisedQty) AS Units_Out 
      FROM customer c 
     LEFT JOIN job_new jn ON jn.JobOwnerID = c.ID 
     LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
     LEFT JOIN job_pieces jpc ON jpc.JobID = jn.ID AND jn.CollectMemberID = jn.JobOwnerID 
     LEFT JOIN job_pieces jpd ON jpd.JobID = jn.ID AND jn.DeliverMemberID = jn.JobOwnerID 
    WHERE jn.IsActive = 1 GROUP BY jn.JobOwnerID 
+0

Вместо этого попробуйте 'GROUP BY c.Name'. – jarlh

+0

'GROUP BY jn.JobOwnerID WITH ROLLUP' – Mihai

ответ

4

Вы ищете GROUP BY модификатора WITH ROLLUP:

select c.Name, 
     COUNT(distinct jn.ID) as Jobs, 
     SUM(jn.ActualWeight) as GrossWt, 
     SUM(jpc.AdvisedQty) AS Units_In, 
     SUM(jpd.AdvisedQty) AS Units_Out 
FROM customer c LEFT JOIN 
    job_new jn 
    ON jn.JobOwnerID = c.ID LEFT JOIN 
    job_pieces jp 
    ON jp.JobID = jn.ID LEFT JOIN 
    job_pieces jpc 
    ON jpc.JobID = jn.ID AND jn.CollectMemberID = jn.JobOwnerID LEFT JOIN 
    job_pieces jpd 
    ON jpd.JobID = jn.ID AND jn.DeliverMemberID = jn.JobOwnerID 
WHERE jn.IsActive = 1 
GROUP BY c.Name WITH ROLLUP; 

Примечание: Я также изменил ключ GROUP BY по двум причинам. Во-первых, он действительно должен соответствовать столбцу, используемому в SELECT. Во-вторых, вы использовали значение из таблицы LEFT JOIN, поэтому значение может быть NULL. Это обычно нежелательно.

+0

Это очень классная функция агрегата, не была знакома с этим .. +1 – sagi

+0

спасибо, что это сработало, но для столбца имени он просто скопировал фамилию. Есть ли способ сделать эту строку пустой? – user123456789

+0

@ пользователь123456789. , , В строке агрегации 'c.Name' должен быть' NULL'. Однако это происходит только тогда, когда имена GROUP BY и column совпадают. Не помещайте столбцы в 'SELECT', которые не агрегируются, а не в' GROUP BY'. –