GROUP BY
句で列の別名を使用することはできません。Select ステートメントの評価の概念的な順序 を参照してください。ここでは、節が次の順序で (論理的に) 評価されることがわかりますFROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, UNION, ORDER BY
。
SELECT
これはエンジンが操作を実行する正確な方法ではありませんが、句のステートメントから何かを使用できない理由を確実に実際に理解するための便利なヒューリスティックです。そのままでは句GROUP BY
で論理的に使用できません。GROUP BY
後で評価します。
これにはいくつかの方法があります。
GROUP BY
句内の式全体を繰り返します。
SELECT
City =
CASE location_id when 1 then 'DELHI' when 2 then 'AHMEDABAD'
when 4 then 'HYDERABAD' when 5 then 'KOLKATA' when 6 then 'BANGALORE'
when 7 then 'MUMBAI' when 8 then 'CHENNAI'
END,
Total = Count(*)
FROM #tmptab1
GROUP BY
CASE location_id when 1 then 'DELHI' when 2 then 'AHMEDABAD'
when 4 then 'HYDERABAD' when 5 then 'KOLKATA' when 6 then 'BANGALORE'
when 7 then 'MUMBAI' when 8 then 'CHENNAI'
END
派生テーブルを使用します。
SELECT
City,
Total = Count(*)
FROM
(
SELECT
City =
CASE location_id when 1 then 'DELHI' when 2 then 'AHMEDABAD'
when 4 then 'HYDERABAD' when 5 then 'KOLKATA' when 6 then 'BANGALORE'
when 7 then 'MUMBAI' when 8 then 'CHENNAI'
END
FROM #tmptab1
) Cities
GROUP BY City;
共通テーブル式 (CTE)、SQL Server 2005 以降を使用します。
WITH Cities AS (
SELECT
City =
CASE location_id
when 1 then 'DELHI'
when 2 then 'AHMEDABAD'
when 4 then 'HYDERABAD'
when 5 then 'KOLKATA'
when 6 then 'BANGALORE'
when 7 then 'MUMBAI'
when 8 then 'CHENNAI'
END
FROM #tmptab1
)
SELECT
City,
Total = Count(*)
FROM Cities
GROUP BY City;
CROSS APPLY、SQL Server 2005 以降を使用します。
SELECT
City,
Total = Count(*)
FROM
#tmptab1
CROSS APPLY (
SELECT
City =
CASE location_id when 1 then 'DELHI' when 2 then 'AHMEDABAD'
when 4 then 'HYDERABAD' when 5 then 'KOLKATA' when 6 then 'BANGALORE'
when 7 then 'MUMBAI' when 8 then 'CHENNAI'
END
) C
GROUP BY City;
式は決定論的であるため、単純に を実行できる可能性がありますがGROUP BY location_id
、これは通常のケースではなく、単一の列を選択することで通常の集計グループ化ロジックを回避できると期待して回るべきではありません。そのような CASE 式が決定論的ではない値を追加するとき。
実際、情報は決定論的であるだけでなく、(ビジネス ルールではなく) 現実世界に関するものであるため、クエリでこの情報をエンコードしないことをお勧めします。テーブルを作成し、Location
それに結合します。変更可能なユーザー データを直接クエリに入れるのはベスト プラクティスではありません。クエリは、コンテンツではなくプロセスを記録することになっています。新しい location_id を追加するとどうなるでしょうか。それを使用するすべてのクエリを変更する必要があります。さらに、複数の都市が同じ都市を参照できるlocation_id
場合、グループ化は適切に機能しません。location_id