背景
データベース内に時間の経過に伴うデータを管理している場合、例えば、財務データや販売データなど、前年の値を現在の値と比較する必要が出てくることがあります。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
条件を組み合わせることで、別の日付のデータを現在のデータにマージすることができます。必要に応じて結合条件を調整し、特定の要件に合わせてデータを取得してみてください。