T-SQL Dynamic Pivot动态透视查询计数异常问题咨询
问题原因解析
1. 为什么透视查询返回的Education非空行数远低于实际值
这是SQL Server PIVOT 运算符的固有逻辑导致的:PIVOT 执行时会自动把子查询中除了聚合函数字段、要转成列的[Key]字段之外的所有字段作为分组依据,同一个分组内的多行数据会被聚合为一行。
你的透视子查询仅选择了OrganisationGuid、Total、[Key]、[Value]四个字段,所以分组依据就是OrganisationGuid + Total的组合:
- 同一个
OrganisationGuid+Total组合下如果存在多条Key='Education'的记录,PIVOT用的max([Value])聚合函数只会保留其中最大的一个Value,其余的行都会被合并丢弃 - 你统计到的23行本质是有Education值的
OrganisationGuid+Total唯一组合的数量,而非原始表中Education键的实际行数,自然远低于128的真实值
你可以执行以下语句验证这个逻辑:
SELECT OrganisationGuid, Total, COUNT(*) AS 重复行数 FROM dbo.DimTable WHERE [Key] = 'Education' GROUP BY OrganisationGuid, Total HAVING COUNT(*) > 1
返回结果就是所有被合并的重复分组,所有分组的重复行数累加后就是128和23的差值。
2. 为什么加入uniqueID后结果计数和实际一致
uniqueID是维度表每行唯一的标识列,你把它加入透视子查询的SELECT列表后,PIVOT的分组依据就变成了uniqueID + OrganisationGuid + Total的组合:
- 因为
uniqueID全局唯一,每个分组只会对应原始表的1行数据,不会出现多行合并的情况 - 每个原始的Education键记录都会对应透视后的1行数据,所以统计出来的行数和直接查询维度表的128行完全匹配
内容的提问来源于stack exchange,提问作者3355307
相关产品推荐
相关产品推荐

