背景
データベース内に時間の経過に伴うデータを管理している場合、例えば、財務データや販売データなど、前年の値を現在の値と比較する必要が出てくることがあります。SQLでは、JOINを使うことで、異なる条件でデータを結合し、必要な情報を取り出すことができます。
この記事では、MySQLのLEFT JOINを使用して、同じsecCodeを持つ1年前のデータを現在のデータにマージする方法について説明します。
1年前のデータをマージするための基本的なSQL構文
以下の例では、your_table_name というテーブルを使用して、secCodeが同じで、EndDateが1年違うレコードを結合します。
クエリ例
SELECT 
    t1.secCode,
    t1.EndDate,
    t1.Asset,
    t2.Asset AS Asset_b
FROM 
    your_table_name t1
LEFT JOIN 
    your_table_name t2
ON 
    t1.secCode = t2.secCode
    AND YEAR(t1.EndDate) = YEAR(t2.EndDate) + 1;
解説
- 
SELECT 文: t1とt2という2つのテーブルエイリアス(別名)からデータを選択しています。t1.Assetは現在のデータのAsset列を指し、t2.Asset AS Asset_bは1年前のデータのAsset列をAsset_bという名前で取得しています。
- 
FROM 文: your_table_nameというテーブルにエイリアスt1を付けています。LEFT JOINでは、t1の全ての行を返します。
- 
LEFT JOIN 文: 同じテーブル your_table_nameをエイリアスt2として再度結合しています。LEFT JOINを使用することで、t1に存在するすべての行を取得し、対応するt2の行がない場合にはNULLが返されます。
- 
ON 条件: t1とt2のsecCodeが一致し、EndDateの年が1年差である行を結合する条件を指定しています。ここではYEAR(t1.EndDate) = YEAR(t2.EndDate) + 1により、t1のEndDateと1年前のt2のEndDateが一致する場合に結合します。
実行例
例えば、以下のようなデータが your_table_name テーブルに格納されているとします。
| secCode | EndDate | Asset | 
|---|---|---|
| 001 | 2024-01-01 | 100 | 
| 001 | 2023-01-01 | 90 | 
| 002 | 2024-01-01 | 200 | 
| 002 | 2023-01-01 | 180 | 
| 003 | 2024-01-01 | 150 | 
このテーブルに対して上記のクエリを実行すると、以下の結果が得られます。
| secCode | EndDate | Asset | Asset_b | 
|---|---|---|---|
| 001 | 2024-01-01 | 100 | 90 | 
| 002 | 2024-01-01 | 200 | 180 | 
| 003 | 2024-01-01 | 150 | NULL | 
secCode 001と002には1年前の Asset データが存在するため、それぞれの Asset_b に値が入ります。secCode 003 には1年前のデータがないため、Asset_b は NULL になります。
応用編:月や日まで考慮した結合
場合によっては、1年前のデータを年だけでなく月や日まで考慮して結合したい場合があります。その場合は、次のように月と日も ON 条件に追加します。
SELECT 
    t1.secCode,
    t1.EndDate,
    t1.Asset,
    t2.Asset AS Asset_b
FROM 
    your_table_name t1
LEFT JOIN 
    your_table_name t2
ON 
    t1.secCode = t2.secCode
    AND YEAR(t1.EndDate) = YEAR(t2.EndDate) + 1
    AND MONTH(t1.EndDate) = MONTH(t2.EndDate)
    AND DAY(t1.EndDate) = DAY(t2.EndDate);
このようにすることで、年月日が一致する1年前のデータだけをマージすることができます。
まとめ
LEFT JOIN と ON 条件を組み合わせることで、別の日付のデータを現在のデータにマージすることができます。必要に応じて結合条件を調整し、特定の要件に合わせてデータを取得してみてください。

 
  
  
  
  
