sql >> データベース >  >> RDS >> Mysql

SQLクエリを使用して、特定のカテゴリとさらに分岐したサブカテゴリの数を取得します

    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



    1. PHPスクリプトUTF8をMYSQLに挿入

    2. Symfony2、Doctrine2、MySql、ビューテーブル

    3. LIMITを使用してMySQLの結果の総数を見つけるためのDoctrineクエリ

    4. クラウドでのデータベース負荷分散-ProxySQL2.0を使用したMySQLマスターフェイルオーバー:パート1(導入)