MW211 EXIT

devlog
MSSQL/キーを集約
2015年01月02日
キーに「-xxx」的な枝番がついていて、これらを横断して枝番なしの集約キーで
合計を取りたい場合。

まず、文字列操作で集約キーを求めるには以下のような感じになる。
┌──────────────────────────────────────┐
│SELECT CASE                                                                 │
│         WHEN CHARINDEX('-', [キー]) > 0 THEN                               │
│           SUBSTRING([キー], 0, CHARINDEX('-', [キー]))                     │
│         ELSE                                                               │
│           [キー]                                                           │
│       END AS [集約キー]                                                    │
│    FROM [表]                                                               │
└──────────────────────────────────────┘
「CHARINDEX('-', [キー])」で「-」の位置を求める。
なければ「0」なので、別途、キーをそのままとする。
あったら、そこまでを「SUBSTRING([キー], 0, ~)」で抽出する。
(Excel関数の「mid()」みたいなもんだ)

ということで、こいつらをSELECT、GROUP BY、ORDER BYに展開するとできあがり。
┌──────────────────────────────────────┐
│SELECT CASE                                                                 │
│         WHEN CHARINDEX('-', [キー]) > 0 THEN                               │
│           SUBSTRING([キー], 0, CHARINDEX('-', [キー]))                     │
│         ELSE                                                               │
│           [キー]                                                           │
│       END AS [集約キー],                                                   │
│       SUM([値]) AS [合計]                                                  │
│    FROM [表]                                                               │
│    GROUP BY CASE                                                           │
│               WHEN CHARINDEX('-', [キー]) > 0 THEN                         │
│                 SUBSTRING([キー], 0, CHARINDEX('-', [キー]))               │
│               ELSE                                                         │
│                 [キー]                                                     │
│             END                                                            │
│    ORDER BY CASE                                                           │
│               WHEN CHARINDEX('-', [キー]) > 0 THEN                         │
│                 SUBSTRING([キー], 0, CHARINDEX('-', [キー]))               │
│               ELSE                                                         │
│                 [キー]                                                     │
│             END ASC                                                        │
└──────────────────────────────────────┘
分類:MSSQL