2012-08-01から1ヶ月間の記事一覧

履歴管理されているマスタを圧縮するSQL

[2012/8/23] 内容に誤りがあったため、一旦公開を停止していましたが、SQLが修正できたの再度公開しました。昨今は、どこの会社でもマスタを履歴管理するのが流行りらしく、適用期間(適用開始日と終了日)を持つことが多い。以前からこのようなマスタを扱う…

Oracle で SELECT INSERT 文を生成する

データをコピーする場合、CREATE TABLE テーブル名 AS SELECT ... の形式で書くとテーブルのコピーを作ることができる。当然、INSERT INTO テーブル名 SELECT ... の形式で書けばデータコピーできる……と思うのが実は大間違い。この構文では、テーブルのカラ…

PL/SQLでテーブルを同期する

他システムなど外部からデータを取り込み加工して本テーブルに取り込みたい場合というのは非常に多い。非常に多いにも関わらず、SQLでこのような処理を書くのは意外と難しい。いろいろと試行錯誤した結果、FULL JOINを使う方法に落ち着いた。 FOR cur_rec IN…

SQLで条件分岐

条件分岐という言葉を聞いた瞬間、SQLで書くことを諦めてしまう人がいる。しかし、SQLで条件分岐を書きたい時には次のどちらかのパターンを使えば良いだけである。 CASE 句を使う UNION ALL を使う 区分によって計算方法を変えたい場合は前者を使う。 SELECT…

按分時に端数を寄せるSQL

仕訳の配賦処理や消費税の按分計算で端数を伝票の特定の行に寄せたい場合がある。しばしば、この手の計算はPL/SQLなどを使って手続き型で実装されることが多いが、ウィンドウ関数を使えば簡単に実装できる。基本的な考え方はこうだ。 総金額に対する各明細へ…

重複データからユニークな行を取り出すSQL

昨日のエントリで N対M になるようなテーブルを結合するときは、N対1 にする必要がある旨書いたが、具体的にどうするかまでは書かなかった。例えば、全銀CSVをそのまま取り込んだ銀行マスタ(銀行コード、銀行名称、銀行支店コード、銀行支店名称)から銀行…

SQLの組み立て方

ソフトウェア開発をやっていると、SQLが苦手なプログラマに多く出会う。SQLはすごく柔軟で高度な処理を簡潔にかけるにも関わらず、わざわざ単純なSQLを使って大量のデータをした後、Javaなどの手続き型言語で加工するわけだ。単にアホなだけという可能性も否…