SQL存储过程除零错误修复后遇Case语句As语法错误求助
解决SQL存储过程中的语法错误与除零问题
我来帮你排查这个问题,首先你的'at 'as''语法错误根源在于CASE语句的写法不符合SQL规范,我们一步步来修正:
问题根源分析
你错误地将列别名as [Average Sales]放在了CASE语句的THEN分支计算表达式后面,同时还漏掉了CASE语句必须的END闭合标记。SQL里CASE语句的标准结构是:
CASE WHEN 判定条件 THEN 满足条件时的结果 ELSE 不满足条件时的默认结果 END AS 列别名
修正后的完整存储过程代码
下面是修复了语法错误,同时完善了除零逻辑的代码:
create procedure dbo.CompanyAverageSales @startdate as varchar(50), @enddate as varchar(50) As begin select datename(year, SO_SalesOrder.InvoicedDate) as [Year], datename(month, SO_SalesOrder.InvoicedDate) as [Month], l.Name as [Store Name], -- 修正CASE语句结构:移动别名位置,添加END闭合 case when sum(convert(int, SO_SalesOrder.Custom1)) > 0 then sum(SO_SalesOrder_Line.SubTotal) / sum(convert(int, SO_SalesOrder.Custom1)) else 0 -- 可根据需求改为NULL或其他默认值 end as [Average Sales] From SO_SalesOrder inner join BASE_Location l on SO_SalesOrder.LocationId = l.LocationId inner join SO_SalesOrder_Line on SO_SalesOrder.SalesOrderId = SO_SalesOrder_Line.SalesOrderId inner join BASE_PaymentTerms on BASE_PaymentTerms.PaymentTermsId = SO_SalesOrder.PaymentTermsId where SO_SalesOrder.InvoicedDate >= convert(date, @startdate) -- 显式转换日期,避免隐式转换问题 and SO_SalesOrder.InvoicedDate <= convert(date, @enddate) group by l.Name, datename(year, SO_SalesOrder.InvoicedDate), datename(month, SO_SalesOrder.InvoicedDate) end
额外优化建议
- 参数类型优化:把
@startdate和@enddate的类型从varchar(50)改成date/datetime,能直接避免字符串转日期的隐式转换风险,减少潜在错误。 - 除零逻辑灵活调整:如果
sum(convert(int, SO_SalesOrder.Custom1))为0时不想返回0,也可以返回NULL,只需要把else 0替换成else NULL即可。
内容的提问来源于stack exchange,提问作者Arslan ud Din Shafiq
相关产品推荐
相关产品推荐

