Skip to content

20260514thu

Published: at 15:00

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重複を除いた値の一覧を取得する