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

MySQLロールアップの使用方法

    MySQLで合計と小計を計算したり、データに合計行を追加したりする必要がある場合があります。特に小計を計算するためにUNIONステートメントを使用してデータを集計するのは面倒な場合があります。 MySQL Rollupは、このようなユースケースに適しています。 MySQLロールアップを使用してMySQLの合計と小計を計算する方法は次のとおりです。

    MySQLロールアップの使用方法

    MySQLロールアップを使用して合計と小計を計算する手順は次のとおりです。

    MySQL Rollupを使用すると、1つのステートメントを使用して、データを簡単にロールアップし、小計を計算できます。個別に計算してUNIONステートメントを使用して結果を組み合わせる代わりに、これを使用して合計行と小計行をデータに追加することもできます。

    MySQLROLLUPの構文は次のとおりです。

    SELECT 
        column1, column2, column3, ...
    FROM 
        table_name
    GROUP BY
        column1, column2,... WITH ROLLUP;
    

    上記のクエリは、GROUPBY句を使用してデータを集計するのと非常によく似ていますが、GROUPBY句の後にWITHROLLUPキーワードを追加する点が異なります。

    上記のクエリでは、クエリ結果に表示する必要のある列をSELECT句で指定します。テーブル名についても言及する必要があります。 GROUP BY句では、データの集計に基づく列を指定します。

    ボーナスリード:MySQLバージョンを確認する方法

    次のテーブルsales(order_date、sale)があるとします。

    mysql> create table sales(order_date date,sale int);
     
    mysql> insert into sales values('2020-01-01',20),
    ('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
    ('2020-02-05',20),('2020-02-10',20),('2020-02-06',25),
    ('2020-03-07',15),('2020-03-08',30),('2020-03-09',20);
     
    mysql> select * from sales;
    +------------+------+
    | order_date | sale |
    +------------+------+
    | 2020-01-01 |   20 |
    | 2020-01-02 |   25 |
    | 2020-01-03 |   15 |
    | 2020-01-04 |   30 |
    | 2020-02-05 |   20 |
    | 2020-02-10 |   20 |
    | 2020-02-06 |   25 |
    | 2020-03-07 |   15 |
    | 2020-03-08 |   30 |
    | 2020-03-09 |   20 |
    +------------+------+
    

    ボーナスリード:MySQLで外部キーチェックを無効にする方法

    合計値を計算し、合計行をテーブルに追加するためのMySQLロールアップのSQLクエリは次のとおりです。総計は常に最後の行として追加され、GROUPBY列にはNULL値が割り当てられます。

    mysql> select * from sales 
           group by order_date with rollup;
    +------------+------+
    | order_date | sale |
    +------------+------+
    | 2020-01-01 |   20 |
    | 2020-01-02 |   25 |
    | 2020-01-03 |   15 |
    | 2020-01-04 |   30 |
    | 2020-02-05 |   20 |
    | 2020-02-06 |   25 |
    | 2020-02-10 |   20 |
    | 2020-03-07 |   15 |
    | 2020-03-08 |   30 |
    | 2020-03-09 |   20 |
    | NULL       |   20 |
    +------------+------+
    

    上記のクエリでは、 order_dateでロールアップします。 列。

    ボーナスリード:MySQLでシーケンスを作成する方法

    GROUP BY句で複数の列を指定すると、MySQLはそれらの間の階層を想定し、それに応じてデータをロールアップします。

    たとえば、あなたが言及した場合

    GROUP BY c1, c2, c3 WITH ROLLUP
    

    その後、MySQLが想定します

    c1 > c2 > c3
    

    したがって、MySQL Rollupを使用するときは、GROUPBY句の列の順序に注意することが重要です。次の表があるとします。

    mysql> create table sales(product varchar(255),order_date date,sale int);
    
    mysql> insert into sales values('A','2020-01-01',20),('B','2020-01-02',25),
    ('B','2020-01-03',15),('A','2020-01-04',30),('A','2020-01-05',20);
    
    mysql> select * from sales;
    +---------+------------+------+
    | product | order_date | sale |
    +---------+------------+------+
    | A       | 2020-01-01 |   20 |
    | B       | 2020-01-02 |   25 |
    | B       | 2020-01-03 |   15 |
    | A       | 2020-01-04 |   30 |
    | A       | 2020-01-05 |   20 |
    +---------+------------+------+
    

    ボーナスリード:MySQLで2つのテーブルを比較する方法

    これは、product列とorder_date列ごとにデータをロールアップするSQLクエリです。この場合、MySQLは総計を計算して最後に表示するだけでなく、最後の列、つまり product のみを除いて、GROUPBY句に記載されている各列の列ごとの小計も計算します。 列。

    mysql> select product,order_date,sum(sale) 
           from sales group by product,order_date with rollup;
    +---------+------------+-----------+
    | product | order_date | sum(sale) |
    +---------+------------+-----------+
    | A       | 2020-01-01 |        20 |
    | A       | 2020-01-04 |        30 |
    | A       | 2020-01-05 |        20 |
    | A       | NULL       |        70 |
    | B       | 2020-01-02 |        25 |
    | B       | 2020-01-03 |        15 |
    | B       | NULL       |        40 |
    | NULL    | NULL       |       110 |
    +---------+------------+-----------+
    

    上記の結果では、製品ごとの合計と総計が太字として強調表示されています。

    GROUP BY句でorder_dateに言及し、次にproduct列に言及した場合の結果は次のとおりです。この場合、MySQLはorder_dateごとの合計と総計を計算します。

    mysql> select product,order_date,sum(sale) 
           from sales group by order_date,product with rollup;	   
    
    +---------+------------+-----------+
    | product | order_date | sum(sale) |
    +---------+------------+-----------+
    | A       | 2020-01-01 |        20 |
    | NULL    | 2020-01-01 |        20 |
    | B       | 2020-01-02 |        25 |
    | NULL    | 2020-01-02 |        25 |
    | B       | 2020-01-03 |        15 |
    | NULL    | 2020-01-03 |        15 |
    | A       | 2020-01-04 |        30 |
    | NULL    | 2020-01-04 |        30 |
    | A       | 2020-01-05 |        20 |
    | NULL    | 2020-01-05 |        20 |
    | NULL    | NULL       |       110 |
    +---------+------------+-----------+
    

    ご覧のとおり、GROUP BY句に記載されている列の順序を変更すると、結果が異なります。それでも、MySQL ROLLUPは、小計をすばやく計算し、MySQLに合計行を追加するための非常に便利な方法です。

    Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. Windowsでxamppのコマンドラインにアクセスする方法

    2. MariaDBでのPOW()のしくみ

    3. カーソル:ピンSはXで待機

    4. Oracle SQL:別のテーブルのデータでテーブルを更新します