20260514thu
即時振替に関連する仕訳レコードを抽出し、同一の外部番号グループ内で連番と件数を付与するSQLです。
① CTE+LIKE JOIN で関連レコードを絞り込む
即時振替番号 CTE で「即時振替かつ文書番号が 10」の行から外部番号(外部番号1 と 外部番号2 を連結)を一覧化します。
メインクエリでは LIKE '%' + t.外部番号 + '%' を使い、CTE の連結番号に部分一致する仕訳行を取得しています。
WITH 即時振替番号 AS (
SELECT DISTINCT concat(外部番号1, 外部番号2) as 外部番号
FROM 仕訳テーブル
WHERE 勘定科目名 = '即時振替' and 文書番号 = '10'
)
SELECT
ROW_NUMBER() OVER (PARTITION BY t.外部番号 ORDER BY t.伝票番号) AS 連番,
COUNT(*) OVER (PARTITION BY t.外部番号) AS 同一番号の件数,
t.*
FROM 仕訳テーブル t
INNER JOIN 即時振替番号 c
ON c.外部番号 LIKE '%' + t.外部番号 + '%'
-- ON t.外部番号 in (c.外部番号1 ,c.外部番号2)
ORDER BY t.entry_no;
ウィンドウ関数の意味
| 列 | 式 | 内容 |
|---|---|---|
連番 | ROW_NUMBER() OVER (PARTITION BY t.外部番号 ORDER BY t.伝票番号) | 同一外部番号グループ内で伝票番号順に 1 から採番 |
同一番号の件数 | COUNT(*) OVER (PARTITION BY t.外部番号) | 同一外部番号グループの総行数 |
PARTITION BY を使うことで、GROUP BY せずにグループ内集計値を各行に付与できます。
② SELECT DISTINCT で勘定科目名を絞り込む
特定の相手勘定タイプ・文書番号に該当する勘定科目名の種類を確認するSQLです。
SELECT DISTINCT 勘定科目名
FROM 仕訳テーブル
WHERE 相手勘定タイプ = '収益科目' AND 文書番号 IN ('11', '12')
DISTINCT で重複を除いた勘定科目名の一覧を取得します。
まとめ
| ポイント | 内容 |
|---|---|
WITH(CTE) | 条件に合う外部番号をあらかじめ絞り込んで再利用する |
LIKE '%' + 値 + '%' | 部分一致でJOIN。完全一致でよければ = または IN に変える |
ROW_NUMBER() OVER (...) | グループ内の連番。ORDER BY で採番順を制御できる |
COUNT(*) OVER (...) | グループ内の件数を各行に付与。サブクエリ不要 |
SELECT DISTINCT | 重複を除いた値の一覧を取得する |