将CASE语句设置为变量,然后在GROUP BY子句中使用该变量

时间:2012-12-26 14:44:23

标签: sql sql-server variables

我正在使用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子句中引用的唯一列,因此我不确定为什么会出现此错误。

我搜索了网站,但没有发现像我一样的问题(令人惊讶)。那么,我该如何解决这个问题?

更新:我已经包含了数据库类型。至于为我所拥有的代码添加代码,我不确定它会添加除了批量的任何东西,因为它超过200行。这根本不是一个复杂的陈述。它只需要各种国家/地区代码并将其映射到完整的国家/地区名称。例如,美国有50多个代码,所以我使用CASE语句来巩固它们。这允许我按国家/地区分组我的信息。

1 个答案:

答案 0 :(得分: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中,引擎无法将表达式识别为常量。