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

SQL Server动态透视查询中Prop01值错误,如何修正?

问题修复:动态Pivot中Prop01值错误的解决方法

错误原因分析

原代码通过三次UNION将每一行的IsEnabled、PropertyValueString、PropertyValueInt拆分为独立行,导致同一Name(如Prop01)对应多个ValueColumn值:'0'(来自IsEnabled)、'$'(来自PropertyValueString)、NULL(来自PropertyValueInt)。
Pivot阶段使用max(ValueColumn)取字符串最大值时,由于ASCII码中'0'(48)大于'$'(36),最终取到了'0'而非预期的'$'。

修复后的代码

使用COALESCE函数按优先级合并三个列的值,确保每个行仅生成一条有效记录,避免同一Name下出现冲突值:

DECLARE @cols  AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';

SELECT 
    @cols = @cols + QUOTENAME(Name) + ',' 
FROM 
    (SELECT DISTINCT Name 
     FROM ItemsTable 
     WHERE LOWER(ObjectName) = LOWER(@objectName)  
     GROUP BY Name) AS tmp

SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols))

SET @query = 
'SELECT * FROM 
(
    SELECT  
      [Name]      
      ,COALESCE(PropertyValueString, CAST(PropertyValueInt AS VARCHAR(50)), CAST(IsEnabled AS VARCHAR(50))) as [ValueColumn]  
      ,[ObjectName]           
      FROM ItemsTable 
    WHERE LOWER(ObjectName) = LOWER(@objectName)
) src
pivot 
(
    max(ValueColumn) for Name in (' + @cols + ')
) piv'

EXEC sp_executesql @query, N'@objectName VARCHAR(100)', @objectName = @objectName;

修复说明

  • COALESCE按顺序返回第一个非空值:Prop01会优先取PropertyValueString的'$',Prop02取PropertyValueInt的'45',规则类行(如Rule01)则取IsEnabled的'1'。
  • 提前通过WHERE条件过滤指定ObjectName的数据,减少后续处理的数据量,提升查询效率。

内容的提问来源于stack exchange,提问作者SoftwareDveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:03:13