CASE 语句 - 已达到表达式服务限制
CASE Statement - An expression services limit has been reached
我收到以下错误:
An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
我正在尝试 运行 下面的查询,但是在我的 case 语句中似乎有一行太多(当我删除“伦敦”行时,它工作得很好)或“苏格兰”例如。
我想不出拆分此语句的最佳方式。
如果我将它分成 2 个查询并合并所有,它确实有效。然而 ELSE 'No Region'
成为一个问题。查询第一部分中包含的所有内容在查询的第二部分都显示为“无区域”,反之亦然。
(我的最终目标基本上是创建每个区域的客户列表)然后我可以将其用作区域销售报告的基础。
非常感谢
安迪
SELECT T0.CardCode, T0.CardName, T0.PostCode,
CASE
WHEN T0.PostCodeABR IN ('DG','KW','IV','PH','AB','DD','PA','FK','KY','G','EH','ML','KA','TD') THEN 'Scotland'
WHEN T0.PostCodeABR IN ('BT') THEN 'Ireland'
WHEN T0.PostCodeABR IN ('CA','NE','DH','SR','TS','DL','LA','BD','HG','YO','HX','LS','FY','PR','BB','L','WN','BL','OL') THEN 'North M62'
WHEN T0.PostCodeABR IN ('CH','WA','CW','SK','M','HD','WF','DN','HU','DE','NG','LN','S') THEN 'South M62'
WHEN T0.PostCodeABR IN ('LL','SY','LD','SA','CF','NP') THEN 'Wales'
WHEN T0.PostCodeABR IN ('NR','IP','CB') THEN 'East Anglia'
WHEN T0.PostCodeABR IN ('SN','BS','BA','SP','BH','DT','TA','EX','TQ','PL','TR') THEN 'South West'
WHEN T0.PostCodeABR IN ('LU','AL','HP','SG','SL','RG','SO','GU','PO','BN','RH','TN','ME','CT','SS','CM','CO') THEN 'South East'
WHEN T0.PostCodeABR IN ('ST','TF','WV','WS','DY','B','WR','HR','GL','OX','CV','NN','MK','PE','LE') THEN 'Midlands'
WHEN T0.PostCodeABR IN ('WD','EN','HA','N','NW','UB','W','WC','EC','E','IG','RM','DA','BR','CR','SM','KT','TW','SW') THEN 'London'
ELSE 'No Region'
END AS 'Region'
FROM [dbo].[REPS-PostcodeABBR] T0
正如我在评论中提到的,我建议您为 post 代码创建一个“查找”table,然后您需要做的就是 JOIN
table,并且没有“凌乱”和大的CASE
表达式(T-SQL不支持Case
(Switch
) 语句).
所以您的查找 table 看起来有点像这样:
CREATE TABLE dbo.PostcodeRegion (Postcode varchar(2),
Region varchar(20));
GO
--Sample data
INSERT INTO dbo.PostcodeRegion (Postcode,Region)
VALUES('DG','Scotland'),
('BT','Ireland'),
('LL','Wales');
然后您的查询将执行 LEFT JOIN
:
SELECT RPA.CardCode,
RPA.CardName,
RPA.PostCode,
COALESCE(PR.Region,'No Region') AS Region
FROM [dbo].[REPS-PostcodeABBR] RPA --T0 is a poor choice of an alias, there is no T not 0 in "REPS-PostcodeABBR"
LEFT JOIN dbo.PostcodeRegion PR ON RPA.PostCodeABR = PR.Region;
请注意,您可能还想 INDEX
table,and/or 将 UNIQUE CONSTRAINT
或 PRIMARY KEY
应用于 PostCode
列。
感谢您的帮助...我尝试了上述多种方法,它们都有效,但最有效的似乎是这种方法。
在 SAP 中创建了一个查找 table;此 table 包括 PostCodeFrom、PostCodeTo、PostCodeABR、地区
这看起来像; TS00、TS99、TS、北 M62
然后我完成了;
SELECT OCRD.ZipCode PCLOOKUP.Region, PCLOOKUP.PostCodeABR FROM OCRD T0 LEFT OUTER JOIN PCLOOKUP ON OCRD.ZipCode >= PCLOOKUP.PostCodeFROM AND OCRD.ZipCode <= PCLOOKUP.PostCodeFrom
基本上,如果邮政编码介于
FROM AND To 显示缩写和地区。
我收到以下错误:
An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
我正在尝试 运行 下面的查询,但是在我的 case 语句中似乎有一行太多(当我删除“伦敦”行时,它工作得很好)或“苏格兰”例如。
我想不出拆分此语句的最佳方式。
如果我将它分成 2 个查询并合并所有,它确实有效。然而 ELSE 'No Region'
成为一个问题。查询第一部分中包含的所有内容在查询的第二部分都显示为“无区域”,反之亦然。
(我的最终目标基本上是创建每个区域的客户列表)然后我可以将其用作区域销售报告的基础。
非常感谢
安迪
SELECT T0.CardCode, T0.CardName, T0.PostCode,
CASE
WHEN T0.PostCodeABR IN ('DG','KW','IV','PH','AB','DD','PA','FK','KY','G','EH','ML','KA','TD') THEN 'Scotland'
WHEN T0.PostCodeABR IN ('BT') THEN 'Ireland'
WHEN T0.PostCodeABR IN ('CA','NE','DH','SR','TS','DL','LA','BD','HG','YO','HX','LS','FY','PR','BB','L','WN','BL','OL') THEN 'North M62'
WHEN T0.PostCodeABR IN ('CH','WA','CW','SK','M','HD','WF','DN','HU','DE','NG','LN','S') THEN 'South M62'
WHEN T0.PostCodeABR IN ('LL','SY','LD','SA','CF','NP') THEN 'Wales'
WHEN T0.PostCodeABR IN ('NR','IP','CB') THEN 'East Anglia'
WHEN T0.PostCodeABR IN ('SN','BS','BA','SP','BH','DT','TA','EX','TQ','PL','TR') THEN 'South West'
WHEN T0.PostCodeABR IN ('LU','AL','HP','SG','SL','RG','SO','GU','PO','BN','RH','TN','ME','CT','SS','CM','CO') THEN 'South East'
WHEN T0.PostCodeABR IN ('ST','TF','WV','WS','DY','B','WR','HR','GL','OX','CV','NN','MK','PE','LE') THEN 'Midlands'
WHEN T0.PostCodeABR IN ('WD','EN','HA','N','NW','UB','W','WC','EC','E','IG','RM','DA','BR','CR','SM','KT','TW','SW') THEN 'London'
ELSE 'No Region'
END AS 'Region'
FROM [dbo].[REPS-PostcodeABBR] T0
正如我在评论中提到的,我建议您为 post 代码创建一个“查找”table,然后您需要做的就是 JOIN
table,并且没有“凌乱”和大的CASE
表达式(T-SQL不支持Case
(Switch
) 语句).
所以您的查找 table 看起来有点像这样:
CREATE TABLE dbo.PostcodeRegion (Postcode varchar(2),
Region varchar(20));
GO
--Sample data
INSERT INTO dbo.PostcodeRegion (Postcode,Region)
VALUES('DG','Scotland'),
('BT','Ireland'),
('LL','Wales');
然后您的查询将执行 LEFT JOIN
:
SELECT RPA.CardCode,
RPA.CardName,
RPA.PostCode,
COALESCE(PR.Region,'No Region') AS Region
FROM [dbo].[REPS-PostcodeABBR] RPA --T0 is a poor choice of an alias, there is no T not 0 in "REPS-PostcodeABBR"
LEFT JOIN dbo.PostcodeRegion PR ON RPA.PostCodeABR = PR.Region;
请注意,您可能还想 INDEX
table,and/or 将 UNIQUE CONSTRAINT
或 PRIMARY KEY
应用于 PostCode
列。
感谢您的帮助...我尝试了上述多种方法,它们都有效,但最有效的似乎是这种方法。
在 SAP 中创建了一个查找 table;此 table 包括 PostCodeFrom、PostCodeTo、PostCodeABR、地区
这看起来像; TS00、TS99、TS、北 M62
然后我完成了;
SELECT OCRD.ZipCode PCLOOKUP.Region, PCLOOKUP.PostCodeABR FROM OCRD T0 LEFT OUTER JOIN PCLOOKUP ON OCRD.ZipCode >= PCLOOKUP.PostCodeFROM AND OCRD.ZipCode <= PCLOOKUP.PostCodeFrom
基本上,如果邮政编码介于 FROM AND To 显示缩写和地区。