GROUP BYエイリアスが適用される前に解析されるため、エイリアスを使用することはできません。エイリアスを使用できる唯一の場所は句です。これは、エイリアスが定義さORDER BYれた後に解析される唯一の句であるためです。SELECT
GROUP BY一般的な回避策は、句で式を繰り返すことです。
SELECT x = CASE ... END, SUM(something)
FROM dbo.somewhere
GROUP BY CASE ... END;
またはCTEを使用して:
;WITH src AS
(
SELECT x = CASE ... END, something
FROM dbo.somewhere
)
SELECT x, SUM(something)
FROM src
GROUP BY x;
またはサブクエリを使用します。
SELECT x, SUM(something)
FROM
(
SELECT x = CASE ... END, something
FROM dbo.somewhere
) AS src
GROUP BY x;
これらはすべて同様に最適化する必要がありますが、特定のシナリオをテストして確認する必要があります。
あなたの場合、これを次のように書くことができます:
SELECT CustID,
[Read] = MAX(CASE permission WHEN 'read' THEN 'X' END),
[Write] = MAX(CASE permission WHEN 'write' THEN 'X' END),
[Own] = MAX(CASE permission WHEN 'own' THEN 'X' END),
[Destroy] = MAX(CASE permission WHEN 'destroy' THEN 'X' END)
FROM dbo.rights
GROUP BY custID;
またはこのように:
SELECT CustID,
MAX([Read]), MAX([Write]), MAX([Own]), MAX([Destroy])
FROM
(
SELECT CustID,
[Read] = CASE permission WHEN 'read' THEN 'X' END,
[Write] = CASE permission WHEN 'write' THEN 'X' END,
[Own] = CASE permission WHEN 'own' THEN 'X' END,
[Destroy] = CASE permission WHEN 'destroy' THEN 'X' END
FROM dbo.rights
) AS src
GROUP BY custID;
列またはテーブルを区切るために単一引用符を使用しないでください'alias'。構文が廃止されるだけでなく、エンティティが文字列リテラルのように見えます。エスケープする必要がある場合 (たとえば、不適切な列名を選択した場合)、 を使用します[square brackets]。