MySQL group byは、より広範な集約を提供するWITHROLLUPをサポートしています。
従業員テーブルが次のようになっているとします。
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...
このようなクエリ:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role
おなじみのものを生み出すだろう:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
など
ここで、WITH ROLLUPを追加すると:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
そうすると、MySQLも役割を無視し、性別でグループ化するだけです:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29
NULLの役割の行は、すべての役割がひとまとめにされた行であり、カウントは男性の合計です。 ROLLUPは右から左にロールするので、GROUP BY a,b,c,d WITH ROLLUP
「alla、b、c」、「all a、b」、「all a」の行が追加されるため、グループ内で性別と役割を並べ替える順序が重要です。
最後に、例のように、テキストの列が1つだけになるようにデータの形状を少し変更したい場合は、次のようにします。
SELECT COALESCE(Role, Gender) as Desc, Ctr
(
SELECT Gender, Role, COUNT(*) as Ctr
FROM employee
GROUP BY Gender, Role WITH ROLLUP
) x --need to use a subquery - see manual
ORDER BY Gender, Role
ただし、これを行うと、女性の「マネージャー」行と男性の「マネージャー」行を具体的に区別するものが何も残っていないため、問題が発生することに注意してください。それは純粋に注文に依存しているので、それは素晴らしい考えではありません。これが、通常、この方法で小計をフロントエンドに任せる理由です。そのため、レポートパッケージはデータをまとめます。これをJSONに変換し、リモートコンピューターに送信すると、順序が失われるなどの操作を行うと、情報が無意味になります。個人的に私はもっと次のようなことをします:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
男性マネージャーと女性マネージャーのデータを行に保持して区別できるようにしますが、NULLを(Total)
に変換します。 それが何であるかについてのより良い情報を提供するために
列自体にNULL値が含まれている場合など、他にも議論することがありますが、そのためのファインマニュアルを紹介します。 https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html