动态SELECT语句中CONCAT失效,需仅在Factory Total行后添加%符号
解决动态SELECT查询中CONCAT导致的类型转换错误
问题根源
报错Conversion failed when converting the varchar value '820%' to data type int的核心原因是UNION ALL合并的两个结果集数据类型不匹配:
- 第一个子查询里,
ISNULL(Sum(PlanProduction),0)返回的是整数类型 - 第二个子查询用
Concat(Sum(PlanProduction),'%')返回的是字符串类型
SQL会自动尝试将字符串转换为整数,但带%的字符串无法完成转换,因此触发错误。
解决方案
把第一个子查询的结果也转换为字符串类型,确保UNION ALL两边的other_columns列类型一致,再在"zFactory Total"行拼接%符号。
修改后的完整代码
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SET @cols = STUFF( (SELECT distinct ',' + quotename([date]) FROM Table_1 WHERE Date between '20230101' and '20230828' FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'select LineName, ' + @cols + ' from (select LineName,[date],CAST(ISNULL(Sum(PlanProduction),0) AS VARCHAR(20)) other_columns from Table_17Q group by LineName, [date] UNION ALL SELECT ''zFactory Total'',date, Concat(Sum(PlanProduction),''%'') other_columns from Table_1 group by LineName, [date] ) x pivot (max(other_columns) for [date] in (' + @cols + ')) p Order by LineName' ; execute( @query)
补充说明
如果需要让非"zFactory Total"行保持数字格式展示,也可以在最终查询阶段再做格式处理,但必须保证UNION ALL的两个结果集列数据类型完全一致,否则必然触发类型转换错误。
内容的提问来源于stack exchange,提问作者Computer knowledge
相关产品推荐
相关产品推荐

