MW211 EXIT

devlog
Oracle/年月表
2018年02月05日
ピボット集計にて、縦軸に年、横軸に1~12月のマトリクス表を出力するSQL文。
┌──────────────────────────────────────┐
│WITH "年月D" AS (                                                          │
│    SELECT "年",                                                            │
│           "月",                                                            │
│           COUNT(*) AS "値"                                                 │
│        FROM (                                                              │
│            SELECT "年"                                                     │
│                   "月"                                                     │
│                FROM "表"                                                   │
│        )                                                                   │
│        GROUP BY "年",                                                      │
│                 "月"                                                       │
│)                                                                           │
│SELECT *                                                                    │
│    FROM (                                                                  │
│        SELECT "カレンダM"."年",                                           │
│               "カレンダM"."月",                                           │
│               NVL("年月D"."値", 0) AS "値"                                │
│            FROM (                                                          │
│                SELECT "年"."年",                                           │
│                       "月"."月"                                            │
│                    FROM (                                                  │
│                        SELECT 開始年 + ROWNUM - 1  AS "年"                 │
│                            FROM DUAL                                       │
│                                 CONNECT BY ROWNUM <= 終了年 - 開始年 + 1   │
│                    ) "年"                                                  │
│                        CROSS JOIN (                                        │
│                            SELECT ROWNUM AS "月"                           │
│                                FROM DUAL CONNECT BY ROWNUM <= 12           │
│                        ) "月"                                              │
│            ) "カレンダM"                                                  │
│                LEFT JOIN "年月D"                                          │
│                  ON  "年月D"."年" = "カレンダM"."年"                     │
│                  AND "年月D"."月" = "カレンダM"."月"                     │
│    ) "集計D"                                                              │
│    PIVOT (                                                                 │
│        SUM("値") FOR "月" IN ( 1 AS  "1月",                                │
│                                2 AS  "2月",                                │
│                                3 AS  "3月",                                │
│                                4 AS  "4月",                                │
│                                5 AS  "5月",                                │
│                                6 AS  "6月",                                │
│                                7 AS  "7月",                                │
│                                8 AS  "8月",                                │
│                                9 AS  "9月",                                │
│                               10 AS "10月",                                │
│                               11 AS "11月",                                │
│                               12 AS "12月")                                │
│    ) "ピボット"                                                            │
│    ORDER BY "年" ASC;                                                      │
└──────────────────────────────────────┘
  ・「開始年」と「終了年」の部分はそれぞれの数値に置き換える
  ・「年月D」の中身を変えれば、元データをいろいろなものにできる
分類:Oracle
Oracle/一つ前のレコード
2018年02月02日
一つ前のレコードを参照するには、LAG()関数を使う。こんな感じ。
┌──────────────────────────────────────┐
│SELECT LAG("列") OVER(PARTITION BY "グループ列"                             │
│                      ORDER BY     "ソート列"   ASC) AS "列"                │
│    FROM "表";                                                              │
└──────────────────────────────────────┘
その列だけ局地的に一つ前のレコードを取得するような感じになる。
なお、一つまえのレコードがない場合には、「NULL」になる。

では、結合した場合はどうか?
┌──────────────────────────────────────┐
│SELECT LAG("副表"."列") OVER(PARTITION BY "副表"."グループ列"               │
│                             ORDER BY     "副表"."ソート列"   ASC) AS "列"  │
│    FROM "主表"                                                             │
│        LEFT JOIN "副表"                                                    │
│          ON "副表"."主キー" = "主表"."外部キー";                           │
└──────────────────────────────────────┘
うっかりこういうのはNG。予期せぬ「NULL」が多発する。
なぜなら、LAG()関数はあくまで直前の母集団の一つ前のレコードを探し出してくるので
この場合、"副表"側全部の中の一つ前のレコードとはならないのだ。

とはいえ、以下のようなのはNG。
┌──────────────────────────────────────┐
│SELECT "副表"."列"                                                          │
│    FROM "主表"                                                             │
│        LEFT JOIN "副表" "中継副表"                                         │
│            LEFT JOIN "副表"                                                │
│              ON "副表"."主キー"                                            │
│       = LAG("中継副表"."主キー") OVER(PARTITION BY "副表"."グループ列"     │
│                                       ORDER BY     "副表"."ソート列"   ASC)│
│          ON "中継副表"."主キー" = "主表"."外部キー";                       │
└──────────────────────────────────────┘
「ORA-30483: ここでウィンドウ・ファンクションは使用できません。」エラーとなる。

なので、副問合せの時点で解決してしまうのがよいようだ。
┌──────────────────────────────────────┐
│SELECT "副表"."列"                                                          │
│    FROM "主表"                                                             │
│        LEFT JOIN (                                                         │
│            SELECT "主キー",                                                │
│                   LAG("列") OVER(PARTITION BY "グループ列"                 │
│                                  ORDER BY     "ソート列"   ASC) AS "列"    │
│                FROM "副表"                                                 │
│        ) "副表"                                                            │
│          ON "副表"."主キー" = "主表"."外部キー";                           │
└──────────────────────────────────────┘
本当にこれがベストなのかは不安だが。
分類:Oracle
UUID(GUID)
2018年02月01日
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx│16進法による文字列表記                │
└──────────────────┴───────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【バリアント(変種)】
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-xxxx-0xxx-xxxxxxxxxxxx│後方互換予約                          │
│xxxxxxxx-xxxx-xxxx-1xxx-xxxxxxxxxxxx│(Network Computing System)            │
│xxxxxxxx-xxxx-xxxx-2xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-3xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-4xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-5xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-6xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-7xxx-xxxxxxxxxxxx│                                      │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-8xxx-xxxxxxxxxxxx│一般的に使用(RFC4122)                 │
│xxxxxxxx-xxxx-xxxx-9xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-Axxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-Bxxx-xxxxxxxxxxxx│                                      │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-Cxxx-xxxxxxxxxxxx│後方互換予約                          │
│xxxxxxxx-xxxx-xxxx-Dxxx-xxxxxxxxxxxx│(マイクロソフト(COMのGUID))           │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-Exxx-xxxxxxxxxxxx│将来予約                              │
│xxxxxxxx-xxxx-xxxx-Fxxx-xxxxxxxxxxxx│                                      │
└──────────────────┴───────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【バージョン】
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx│バージョン1(時刻とMACアドレス)        │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-2xxx-xxxx-xxxxxxxxxxxx│バージョン2(時刻とMACとローカルID)    │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx│バージョン3(ハッシュ値)               │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx│バージョン4(乱数値)                   │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-5xxx-xxxx-xxxxxxxxxxxx│バージョン5(ハッシュ値)               │
└──────────────────┴───────────────────┘
分類:設計
前へ 1 2 次へ