1

我正在使用 SQL Server 2008 并且有一个非常大的 CASE 语句,该语句也用于 GROUP By 子句。我想将 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)

至少在 SQL Server 2008 中,引擎不会将表达式识别为常量。

于 2012-12-26T14:50:04.507 回答