SQL IF语句无法运行求助:日期数量判断逻辑实现
解决你的SQL条件判断语句问题
我看你这条SQL里的条件判断写法出问题啦,这就是它跑不起来的原因。咱们先理清楚你的需求:计算当月某一天的销售统计数(取整到十位),如果这个数大于330就返回'X',否则返回这个统计数对吧?
先看看你原语句里的错误:在SQL Server中,你用的IF是流程控制语句,不能直接放在SELECT的字段列表里当条件表达式用。要实现字段级的条件判断,你得用IIF()函数(SQL Server 2012及以上版本支持)或者兼容性更好的CASE WHEN语句。
原问题引用
我无法让这条IF语句正常运行。我想要实现的逻辑是:如果(日期统计数量)大于330,则返回'X',否则返回该日期统计数量。对应的SQL语句如下:
SELECT if(ROUND(COUNT(ClosedDate) / 10, 0) * 10 > 330 then 'X' else ROUND(COUNT(ClosedDate) / 10, 0) * 10) end AS [Previous Day Sales] FROM PartsSales WHERE (MONTH(ClosedDate) = MONTH(GETDATE())) AND (YEAR(ClosedDate) = YEAR(GETDATE())) AND (DAY(ClosedDate) = DAY(GETDATE() - 13))
修正后的代码方案
方案1:使用IIF函数(SQL Server 2012+)
SELECT IIF(ROUND(COUNT(ClosedDate)/10, 0)*10 > 330, 'X', CAST(ROUND(COUNT(ClosedDate)/10, 0)*10 AS VARCHAR(10))) AS [Previous Day Sales] FROM PartsSales WHERE MONTH(ClosedDate) = MONTH(GETDATE()) AND YEAR(ClosedDate) = YEAR(GETDATE()) AND DAY(ClosedDate) = DAY(GETDATE() - 13)
这里注意要把数值结果转成VARCHAR,因为返回的'X'是字符串类型,字段类型要统一,不然会报错。
方案2:使用CASE WHEN(兼容所有SQL Server版本)
SELECT CASE WHEN ROUND(COUNT(ClosedDate)/10, 0)*10 > 330 THEN 'X' ELSE CAST(ROUND(COUNT(ClosedDate)/10, 0)*10 AS VARCHAR(10)) END AS [Previous Day Sales] FROM PartsSales WHERE MONTH(ClosedDate) = MONTH(GETDATE()) AND YEAR(ClosedDate) = YEAR(GETDATE()) AND DAY(ClosedDate) = DAY(GETDATE() - 13)
CASE WHEN是更通用的条件表达式写法,不管你用哪个版本的SQL Server都能正常运行,推荐用这个方案。
额外小提示
你的WHERE条件里用DAY(ClosedDate) = DAY(GETDATE()-13)可能会有问题哦——如果当前日期是1月10号,那GETDATE()-13就是去年12月28号,DAY值是28,但你的条件又限制了年份是今年,这时候就查不到数据了。如果你的需求是查询当前日期往前推13天的销售数据,更准确的写法应该是直接比较日期:
WHERE ClosedDate = DATEADD(DAY, -13, CAST(GETDATE() AS DATE))
这样就不会有跨月跨年的问题啦。
内容的提问来源于stack exchange,提问作者amart47
相关产品推荐
相关产品推荐

