1

SQL Server 2008を使用していて、GROUPBy句でも使用される非常に大きなCASEステートメントがあります。コードのメンテナンスを最小限に抑え、再利用を最大化するために、CASEステートメントを変数に設定したいと思います。問題は、このエラーが発生することです。

Each GROUP BY expression must contain at least one column that is not an outer reference.

このCASED列は、GROUP By句で参照される唯一の列ではないため、このエラーが発生する理由がわかりません。

サイトを検索しましたが、私のような問題は見つかりませんでした(驚くべきことに)。では、どうすればこれを回避できますか?

更新:DBタイプを含めました。私が持っているもののコードを追加する限り、200行を超えるので、それがバルク以外のものを追加するかどうかはわかりません。複雑なステートメントではありません。さまざまな国コードを取得し、それらを完全な国名にマッピングするだけです。たとえば、米国には50を超えるコードがあるため、CASEステートメントを使用してそれらを統合しています。これにより、国ごとに情報をグループ化できます。

4

1 に答える 1

3

これを行う最良の方法は、サブクエリを使用することです。

select var, count(*)
from (select t.*,
             (case <nasty expressions go here>
              end) var
      from t
     ) t
group by var

取得しているエラーは、の変数がgroup by定数であるためです。エラーメッセージが明確でない理由がわかりません。

group byそして、 (私がそうする機会があったように)何らかの理由で実際に定数をに含めたい場合は、列が役立ちます:

group by (case when coalesce(col, '') = coalesce(col, '') then 'some constant' end)

少なくともSQLServer2008では、エンジンは式を定数として認識しません。

于 2012-12-26T14:50:04.507 に答える