MySQLで月ごとにテーブルの合計値を集計する方法
MySQLで日付データを月単位にグループ化して合計値を求めたい場合、GROUP BY句とMONTH()関数を組み合わせることで簡単に実現できます。この記事では、実際のサンプルを使いながら手順を詳しく解説します。
1. サンプルテーブルの作成
まず、購入日と金額を格納するテーブルを作成します。
mysql> create table DemoTable1628
-> (
-> PurchaseDate date,
-> Amount int
-> );
Query OK, 0 rows affected (1.55 sec)2. テストデータの挿入
次に、INSERT文を使って複数のレコードを登録します。意図的に同じ月(10月)のデータを複数件入れている点に注目してください。
mysql> insert into DemoTable1628 values('2019-01-10',1500);
Query OK, 1 row affected (0.68 sec)
mysql> insert into DemoTable1628 values('2019-10-10',2000);
Query OK, 1 row affected (0.61 sec)
mysql> insert into DemoTable1628 values('2019-10-24',100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1628 values('2019-11-10',500);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1628 values('2019-12-10',1600);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable1628 values('2019-10-10',900);
Query OK, 1 row affected (0.47 sec)3. 登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1628;
実行結果は以下の通りです。
+--------------+--------+ | PurchaseDate | Amount | +--------------+--------+ | 2019-01-10 | 1500 | | 2019-10-10 | 2000 | | 2019-10-24 | 100 | | 2019-11-10 | 500 | | 2019-12-10 | 1600 | | 2019-10-10 | 900 | +--------------+--------+ 6 rows in set (0.00 sec)
4. 月ごとの合計を取得するクエリ
ここが本題です。MONTH()関数で月を抽出し、SUM()関数で金額を合計します。年も併せて表示すると、結果がより分かりやすくなります。
mysql> select month(PurchaseDate) as Month,year(PurchaseDate) as Year,SUM(Amount)
-> from DemoTable1628
-> group by month(PurchaseDate);実行結果は以下のようになります。
+-------+------+-------------+ | Month | Year | SUM(Amount) | +-------+------+-------------+ | 1 | 2019 | 1500 | | 10 | 2019 | 3000 | | 11 | 2019 | 500 | | 12 | 2019 | 1600 | +-------+------+-------------+ 4 rows in set (0.20 sec)
ポイント解説
10月のレコードは3件(2000 + 100 + 900)あり、正しく「3000」という合計値に集計されていることが確認できます。
なお、より厳密にはGROUP BY句にもyear(PurchaseDate)を含めておくのが安全です。そうすることで、異なる年の同じ月(例:2019年10月と2020年10月)が誤って同じグループにまとめられることを防げます。
select month(PurchaseDate) as Month,
year(PurchaseDate) as Year,
SUM(Amount) as Total
from DemoTable1628
group by year(PurchaseDate), month(PurchaseDate);このようにGROUP BY MONTH()を使えば、売上やアクセス数などの時系列データを月単位で簡単に集計でき、レポート作成やダッシュボード表示など幅広い場面で活用できます。
-
MySQLで条件に基づいてテーブルから一部の行のみを削除する方法
MySQLで条件に基づいてテーブルから一部の行のみを削除する方法MySQLでは、DELETE文とWHERE句を組み合わせることで、テーブルから条件に合致する行だけを選択的に削除できます。WHERE句を指定しないとテーブル内のすべての行が削除されてしまうため、条件の指定は非常に重要です。ここでは、実際の例を使って手順を解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query O
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec