You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:19