MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

GROUP BY句で明示的な並べ替え順序(ASC・DESC)を指定した場合、WITH ROLLUPのサマリー出力にはどのような影響があるのか?


GROUP BY句の列名に対して明示的な並べ替え順序(ASCまたはDESC)を指定し、「WITH ROLLUP」修飾子と組み合わせた場合でも、ROLLUPによって追加されるサマリー行(合計行)は、指定した並べ替え順序にかかわらず、必ず計算元となる行の後ろに表示されます。

MySQLにおけるデフォルトの並べ替え順序は昇順(ASC)です。そのため、以下の例のように明示的に並べ替え順序を指定しない場合、出力は次のようになります。

mysql> Select sr, SUM(Price) AS Price from ratelist Group by sr with rollup;
+-----+-------+
| sr  | Price |
+-----+-------+
|  1  |   502 |
|  2  |   630 |
|  3  |  1005 |
|  4  |   850 |
|  5  |   250 |
|NULL |  3237 |
+-----+-------+
6 rows in set (0.00 sec)

sr列の値が1から5へ昇順に並べられ、最終行には全行の合計値「3237」がNULLキーとともに出力されています。これがWITH ROLLUPによって追加されたサマリー行です。

次に、同じクエリの並べ替え順序を降順(DESC)に変更して実行してみます。

mysql> Select sr, SUM(Price) AS Price from ratelist Group by sr DESC with rollup;
+-----+-------+
| sr  | Price |
+-----+-------+
|  5  |   250 |
|  4  |   850 |
|  3  |  1005 |
|  2  |   630 |
|  1  |   502 |
|NULL |  3237 |
+-----+-------+
6 rows in set (0.00 sec)

出力結果を見ると、sr列は確かに5から1へと降順に並び替えられています。しかし注目すべきは、サマリー行(NULLの行)が依然として最終行、すなわち計算元となる行の後ろに表示されている点です。

このことから分かるように、WITH ROLLUPを使用した場合、サマリー行の位置はGROUP BY句で指定した並べ替え順序(ASC・DESC)の影響を受けません。スーパー集約行はクエリ処理の最終段階で結果セットに追加されるため、このような挙動になります。

補足:MySQL 8.0以降での注意点

なお、MySQL 8.0以降では、GROUP BY句内に直接ASCやDESCを記述する構文は廃止されています。同様の結果を得たい場合は、ORDER BY句を使用してください。

mysql> Select sr, SUM(Price) AS Price from ratelist Group by sr with rollup Order by sr DESC;
  1. MySQLでASC順にレコードのリストのみを表示する方法

    MySQLでレコードを特定の順序で表示したい場合、条件を設定した上でORDER BY句を使用する必要があります。このようなケースでは、ORDER BY CASEステートメントが非常に便利です。本記事では、特定のレコードを優先的に並べ替えつつ、残りのレコードを昇順(ASC)で表示する方法を解説します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable2039 -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.62 sec)

  2. C#の明示的なインターフェイス実装とは?使いどころをわかりやすく解説

    明示的なインターフェイス実装とは C#では、1つのクラスが「同じシグネチャを持つメンバー」を含む複数のインターフェイスを実装することがあります。この場合、通常の方法でメンバーを実装すると、両方のインターフェイスが同一の実装を共有してしまうことになります。 そこで活用されるのが明示的なインターフェイス実装(Explicit Interface Implementation)です。これは、インターフェイス型を通じてのみ呼び出せるクラスメンバーを作成する手法で、インターフェイスごとに個別の実装を提供できます。 コード例 interface ICar{ void display(); } i