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;
-
MySQLでASC順にレコードのリストのみを表示する方法
MySQLでレコードを特定の順序で表示したい場合、条件を設定した上でORDER BY句を使用する必要があります。このようなケースでは、ORDER BY CASEステートメントが非常に便利です。本記事では、特定のレコードを優先的に並べ替えつつ、残りのレコードを昇順(ASC)で表示する方法を解説します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable2039 -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.62 sec)
-
C#の明示的なインターフェイス実装とは?使いどころをわかりやすく解説
明示的なインターフェイス実装とは C#では、1つのクラスが「同じシグネチャを持つメンバー」を含む複数のインターフェイスを実装することがあります。この場合、通常の方法でメンバーを実装すると、両方のインターフェイスが同一の実装を共有してしまうことになります。 そこで活用されるのが明示的なインターフェイス実装(Explicit Interface Implementation)です。これは、インターフェイス型を通じてのみ呼び出せるクラスメンバーを作成する手法で、インターフェイスごとに個別の実装を提供できます。 コード例 interface ICar{ void display(); } i