我正在使用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语句来巩固它们。这允许我按国家/地区分组我的信息。
答案 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中,引擎无法将表达式识别为常量。