首页 > 数据库 > mysql教程 > 对零值的不同记录使用 PIVOT 查询时如何避免数据丢失?

对零值的不同记录使用 PIVOT 查询时如何避免数据丢失?

DDD
发布: 2025-01-05 20:20:41
原创
962 人浏览过

How to Avoid Data Loss When Using PIVOT Queries on Distinct Records with Zero Values?

避免不同记录的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板