MW211 EXIT

devlog
MSSQL/厳密な「GROUP BY」
2015年03月04日
実は「GROUP BY」では大文字と小文字を区別しない。
┌──────────────────────────────────────┐
│SELECT [集計項目],                                                          │
│       COUNT([キー]) AS [件数]                                              │
│    FROM (VALUES                                                            │
│        (1, 'ABC'),                                                         │
│        (2, 'ABC'),                                                         │
│        (3, 'abc')                                                          │
│    ) AS [テストD] (                                                       │
│        [キー],                                                             │
│        [集計項目]                                                          │
│    )                                                                       │
│    GROUP BY [集計項目];                                                    │
└──────────────────────────────────────┘
例えば上記の場合、「ABC」が「3件」という結果になり、
「abc」も「ABC」扱いとなってしまう。

ということで、厳密に。
WHERE句で使う「COLLATE Japanese」を流用したいところだが、
「GROUP BY」句に付けたらエラーとなってしまう。

正解は、一旦SELECT文で受けてあげるという形をとればよい。
┌──────────────────────────────────────┐
│SELECT [集計項目],                                                          │
│       COUNT([キー]) AS [件数]                                              │
│    FROM (                                                                  │
│        SELECT [キー],                                                      │
│               [集計項目] COLLATE Japanese_CS_AS_KS_WS AS [集計項目]        │
│            FROM (VALUES                                                    │
│                (1, 'ABC'),                                                 │
│                (2, 'ABC'),                                                 │
│                (3, 'abc')                                                  │
│            ) AS [テストD] (                                               │
│                [キー],                                                     │
│                [集計項目]                                                  │
│            )                                                               │
│    )  AS [中間D]                                                          │
│    GROUP BY [集計項目];                                                    │
└──────────────────────────────────────┘
ある意味、変換関数を介する感じだ。
分類:MSSQL