「UP」という同じ名前の列を持つ5つのテーブルの合計を計算するMySQLクエリ
解決方法の概要
「UP」という同じ名前の列を持つ複数のテーブルから合計値を計算するには、UNION ALLとSUM()関数を組み合わせて使用します。各テーブルごとにSUM()で合計を求め、UNION ALLでその結果を縦に連結し、最後に外側のSUM()によって全体の合計値を取得します。
サンプルテーブルの作成
まず、動作確認用に5つのテーブルを作成します。1つ目のテーブルは以下のように作成し、データを挿入します。
mysql> create table DemoTable1977
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1977 values(10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1977 values(20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1977;
+------+
| UP |
+------+
| 10 |
| 20 |
+------+
2 rows in set (0.00 sec)
残りの4つのテーブルも同じ構造で作成し、それぞれデータを挿入していきます。
mysql> create table DemoTable1978
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1978 values(30);
Query OK, 1 row affected (0.00 sec)
mysql> create table DemoTable1979
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1979 values(40);
Query OK, 1 row affected (0.00 sec)
mysql> create table DemoTable1980
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1980 values(50);
Query OK, 1 row affected (0.00 sec)
mysql> create table DemoTable1981
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1981 values(60);
Query OK, 1 row affected (0.00 sec)
これで、DemoTable1977には「10」と「20」、DemoTable1978には「30」、DemoTable1979には「40」、DemoTable1980には「50」、DemoTable1981には「60」がそれぞれ格納されました。
5つのテーブルから合計を計算するクエリ
以下のクエリを実行すると、「UP」という名前の列を持つ5つのテーブル全体の合計値を、たった1回のSQLで取得できます。
mysql> select sum(TotalSum)
from (
select sum(UP) as TotalSum
from DemoTable1977
union all
select sum(UP)
from DemoTable1978
union all
select sum(UP)
from DemoTable1979
union all
select sum(UP)
from DemoTable1980
union all
select sum(UP)
from DemoTable1981
) tbl;
実行結果
+---------------+ | sum(TotalSum) | +---------------+ | 210 | +---------------+ 1 row in set (0.00 sec)
各テーブルの合計値(30+30+40+50+60)を足し合わせた「210」が出力されました。
クエリのポイント
- UNION ALLを使う理由: UNION ALLは重複行を排除せずに結果を連結します。通常のUNIONを使うと、同じ合計値を持つ行が削除されてしまい、誤った結果になる可能性があるため注意が必要です。
- 二重のSUM()構造: 内側のサブクエリでテーブルごとの合計を算出し、外側のSUM(TotalSum)でそれらをさらに合計するという2段階の構造になっています。
- 応用性: 対象テーブルが増えた場合でも、同じ要領でUNION ALLのブロックを追加するだけで簡単に対応できます。
-
MySQLでEMP1、EMP2などの列の値から文字列を削除して数字だけを抽出するクエリの書き方
MySQLでは、EMP1、EMP2、EMP3 のような値から「EMP」という文字列部分を取り除き、数字だけを抽出したいケースがよくあります。このような場合、RIGHT() 関数と LENGTH() 関数を組み合わせることで簡単に実現できます。RIGHT(文字列, n) は右端から n 文字を返し、LENGTH(文字列) は文字列の長さを返します。つまり RIGHT(列名, LENGTH(列名) - 3) とすることで、先頭の3文字(EMP)を除いた残りの部分を取得できます。1. サンプルテーブルを作成するまず、従業員コードを格納するテーブルを作成します。mysql> create tab
-
「order」というテーブル名でMySQLクエリエラーが発生する原因と解決方法
「order」は予約語であることに注意MySQLでは「order」は予約語(ORDER BY句などで使用されるキーワード)として登録されています。そのため、予約語をそのままテーブル名として使用しようとすると、構文エラーが発生します。予約語をテーブル名やカラム名として使いたい場合は、バッククォート(`)で囲む必要があります。テーブルの作成まず、バッククォートで「order」というテーブルを作成してみましょう。mysql> create table `order` -> ( -> StudentId int -> ); Query OK, 0 row