MySQLはgroup byでrollupを行います

4894 ワード

MySQL 4.1.1以降のバージョンではWITH ROLLUP修飾子(modifier)がサポートされ、出力されたセットフィールドを統計できます.年間のワイン販売総額を検索します.
SELECT year,sum(price) FROM wine 
    INNER JOIN items ON wine.id = items.wine_id
    GROUP BY year; 

クエリー結果の一部:
year     sum(price)
1980     2056.12
1981     16234.78
...
2007     18000.12
2008     20183.34

クエリーにWITH ROLLUPを付けると
SELECT year,sum(price) FROM wine 
    INNER JOIN items ON wine.id = items.wine_id
    GROUP BY year
    WITH ROLLUP; 

クエリの結果には、次の行が追加されます.
year     sum(price)
1980     2056.12
1981     16234.78
...
2007     18000.12
2008     20183.34
NULL     5893233.21

この行を多くすると、年はnullを表示し、sum(price)は売上高の合計であり、このような処理は次のコードの実行を省くことができます.
SELECT sum(price) FROM wine 
    INNER JOIN items ON wine.id = items.wine_id;

各ワインの販売総額を探し出す:検索の過程で、産酒区(region)、酒場表(winery)を加えて、WITH ROLLUPを使って各酒場と産酒区の販売金額の肝心な点を得ることができます:GROUP BY句の中でregionとwinery表の唯一の値を使います.
SELECT region_name,winery_name,wine_id,sum(price) FROM region
    INNER JOIN winey ON region.id = winery.region_id
    INNER JOIN wine ON wine.winery_id = winery.id 
    INNER JOIN items ON wine.id = items.wine_id
    GROUP BY region_name,winery_name,wine.id
    WITH ROLLUP; 

クエリー結果の一部:
region_name  winery_name     wine_id    sum(price) 
barissa      anderson wines  112        682.3
barissa      anderson wines  113        732.4
barissa      anderson wines  114        1123.3
barissa      anderson wines  115        68.1
barissa      anderson wines  NULL       2001.8
...
barissa      NULL            NULL       698403.5
...
NULL         NULL            NULL       4287403.6

6行目はanderson wines酒場の総売上高(上位5行の和)を示し、同様に他の酒場の総売上高がその酒場データの後ろに表示され、barissa地区のすべての酒場の照会が完了するとbarissa地区の総金額がwinery_に表示されます.nameとwine_idはnullの行で、最後の行は、すべての地域、酒場、酒品種の売上高の合計です.
WITH ROLLUPの特徴:
  • ORDER BY句はWITH ROLLUPと同時に使用できません.
  • 出力生成後にLIMIT句が使用されるため、合計NULLのデータ行が常に含まれる.