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

MySQLで合計行を追加する方法

    多くの場合、合計とともにMySQLテーブルのデータをレポートする必要があります。 UNION ALLとROLLUPを使用して、MySQLに合計行を追加する方法は2つあります。 MySQLで合計行を追加する方法は次のとおりです。

    MySQLで合計行を追加する方法

    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 |
    +------------+------+
    

    UNION ALLとROLLUPを使用して、MySQLに合計行を追加する2つの方法を見ていきます。 ROLLUP関数はおそらくバージョン5.0からMySQLに追加されました。したがって、古いバージョンで作業する場合は、UNIONALLを使用する必要があります。

    UNIONALLの使用

    このアプローチでは、以下に示すように、データをSUMし、UNIONALL句を使用して元のテーブルに追加するだけです。

    mysql> select * from sales
           UNION ALL
           select 'Total' order_date,sum(sale) 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 |
    | Total      |  220 |
    +------------+------+
    

    上記のクエリでは、最後の行として表示された合計行が、UNIONALLを使用して元のテーブルに追加されます。これは元のテーブルを変更せず、表示された結果のみを変更します。 UNION ALLを使用している間、そこで使用されるすべてのselectクエリで同じ列を維持する必要があります。そのため、テキスト「Total」を order_dateとして割り当てました。 桁。 UNION ALLは、MySQLに合計を追加するための昔ながらの方法です。

    ボーナスリード:MySQLで現在の合計を計算する方法

    ロールアップの使用

    以下に示すように、GROUP BYとROLLUP句を使用して、値を直接合計し、MySQLの合計行を自動的に追加することもできます。

    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 |
    +------------+------+
    

    ROLLUPを使用すると短くなり、合計を含む要約行を追加するのにも役立ちますが、最後の行に「合計」などのカスタムテキストを追加することはできません。もう1つの問題は、複数のレベルのデータを自動的にロールアップし、総計行だけでなく小計行も追加することです。

    ROLLUPを使用してMySQLに合計行を追加する例を次に示します。次の表があるとします

    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で複数の行を1つのフィールドに連結する方法

    GROUP BY句をどのように指定しても、MySQLで合計行を追加するとき、ROLLUPを使用するときは、必ずNULLと小計になります。

    GROUP BY product and order_date
    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 only product
    mysql> select product,order_date,sum(sale) from sales group by product with rollup;
    +---------+------------+-----------+
    | product | order_date | sum(sale) |
    +---------+------------+-----------+
    | A       | 2020-01-01 |        70 |
    | B       | 2020-01-02 |        40 |
    | NULL    | 2020-01-02 |       110 |
    +---------+------------+-----------+
    
    GROUP BY order_date
    mysql> select product,order_date,sum(sale) from sales group by order_date with rollup;
    +---------+------------+-----------+
    | product | order_date | sum(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 |
    | A       | NULL       |       110 |
    +---------+------------+-----------+
    

    ただし、前述のように、これは小計をすばやく計算し、MySQLで合計行を追加するための非常に便利な方法です。

    したがって、行全体をカスタマイズする場合は、より詳細に制御できるUNIONALLを使用してください。一方、小計も計算したい場合は、ROLLUPを使用してください。

    それでおしまい!これで、MySQLで合計行を追加する方法がわかりました。

    レポートツールを使用して、このデータをテーブルにプロットし、チームと共有できます。これは、Ubiqを使用して作成されたテーブルの例です。

    MySQLデータベースからチャート、ダッシュボード、レポートを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。

    1. SQL Serverエージェントジョブ(T-SQL)のジョブステップを更新する

    2. INNERJOINを使用してSQLServerの複数のテーブルを更新する

    3. スキーマ移行を使用してテーブルに事前入力するActiveAndroid

    4. Hibernateを使用してPostgreSQL配列をマップする方法