避免不同记录的 PIVOT 查询中的数据丢失
问题:
PIVOT 查询对于重组很有用数据以更有组织的方式显示信息。但是,在处理不同记录时,MAX 聚合函数可能会导致零值被省略,从而导致数据不完整。
解决方案:
保留所有不同记录,甚至是那些如果值为零,则可以将 ROW_NUMBER() 函数合并到 PIVOT 查询中。此方法为每条记录分配一个行号,从而维护活动和百分比之间的关联。
;with cte as ( select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM from A ), cte2 as ( SELECT Id,Code,ROWNUM,James,James_,Sam,Sam_,Lisa,Lisa_ FROM cte PIVOT(MAX(activity) FOR name IN (James,Sam,Lisa)) AS PVTTable PIVOT ( MAX(percentage) FOR name1 IN (James_,Sam_,Lisa_)) AS PVTTable1 ) select Id, Code, MAX(James) James, MAX(James_) James_, MAX(Sam) Sam, MAX(Sam_) Sam_, MAX(Lisa) Lisa, MAX(Lisa_) Lisa_ from cte2 group by Id, Code, ROWNUM
示例:
考虑下表:
Id | Code | percentage | name | name1 | activity |
---|---|---|---|---|---|
1 | Prashant | 43.43 | James | James_ | Running |
1 | Prashant | 70.43 | Sam | Sam_ | Cooking |
1 | Prashant | 90.34 | Lisa | Lisa_ | Walking |
1 | Prashant | 0.00 | James | James_ | Stealing |
1 | Prashant | 0.00 | James | James_ | Lacking |
1 | Prashant | 73 | Sam | Sam_ | Cooking 1 |
以前,标准 PIVOT 查询会生成以下内容结果:
Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
---|---|---|---|---|---|---|---|
1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
1 | Prashant | Stealing | 0.0 | Cooking | 3.43 | NULL | NULL |
1 | Prashant | NULL | NULL | NULL | NULL | NULL | NULL |
但是,通过合并 ROW_NUMBER() 函数,修改后的查询保留所有不同的记录:
Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
---|---|---|---|---|---|---|---|
1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
1 | Prashant | Stealing | 0.00 | Cooking | 3.43 | NULL | NULL |
1 | Prashant | Lacking | 0.00 | NULL | NULL | NULL | NULL |
此方法可确保显示所有不同的活动,甚至是那些百分比值为零,提供更准确的数据表示。
以上是对零值的不同记录使用 PIVOT 查询时如何避免数据丢失?的详细内容。更多信息请关注PHP中文网其他相关文章!