0
select 
    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 as CITY,
   count(*) as Total
from #tmptab1
group by CITY

エラーが発生します

メッセージ 207、レベル 16、州 1、行 12
無効な列名 'CITY'

これを修正する方法は?助けてください。

4

3 に答える 3

5

GROUP BY句で列の別名を使用することはできません。Select ステートメントの評価の概念的な順序 を参照してください。ここでは、節が次の順序で (論理的に) 評価されることがわかりますFROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, UNION, ORDER BY

SELECTこれはエンジンが操作を実行する正確な方法ではありませんが、句のステートメントから何かを使用できない理由を確実に実際に理解するための便利なヒューリスティックです。そのままでは句GROUP BYで論理的に使用できません。GROUP BY後で評価します。

これにはいくつかの方法があります。

  1. 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
    
  2. 派生テーブルを使用します。

    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;
    
  3. 共通テーブル式 (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;
    
  4. 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

于 2012-12-18T10:22:33.823 に答える
2

group by ステートメントでエイリアスを使用することはできません。group by の select の一部全体が必要になります。

select 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 as CITY,count(1) as Total
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

location_id 自体のグループ化も機能する可能性があります

于 2012-12-18T10:22:06.717 に答える
1

以下(クエリを変更するだけ group by location_id)で動作しますSql-server 2008 or above(以下ではわかりません)

select 
    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 as CITY,
   count(*) as Total
from #tmptab1
group by location_id --NOTE

Orあなたが使用することができます

select 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 as CITY, total
from (
    select location_id, count(*) total
    from #tmptab1 
    group by location_id ) A
于 2012-12-18T10:32:08.463 に答える