SQL查询返回同一键多行数据,是否需用Pivot?SCCM+SSRS报表求助
关于SCCM SQL查询返回多行及Pivot的使用建议
嘿,这个问题我在做SCCM报表时碰到过好多次!先给你理清楚前因后果,再说说Pivot到底适不适合你的场景:
为什么会返回多行数据?
这是因为SCCM的数据库视图里,像网卡(v_GS_NETWORK_ADAPTER)、**物理硬盘(v_GS_PHYSICAL_DISK)**这类硬件信息,是按「每个硬件实例」存一行数据的。比如一台机器插了2张网卡,那Netcard视图里就会有2行对应这台设备的记录;如果有2块硬盘,WD对应的视图也会有2行。当你把这些表和主设备表(v_R_System)关联查询时,自然就会输出多行同一设备的记录。
是否需要用Pivot?
这完全取决于你想要的最终报表展示样式:
- 如果希望把同一设备的多实例信息(比如多个网卡的MAC地址、多个硬盘的序列号)横向合并到一行展示(比如列名变成「MAC地址1」「MAC地址2」「硬盘序列号1」等),那Pivot确实是非常合适的解决方案。
- 如果你的报表可以接受纵向展示同一设备的多条记录,或者想通过报表工具本身来整理格式,那其实不用改SQL,直接用SSRS的分组功能就能搞定:把设备名称(Netbios_Name0)设为分组依据,隐藏重复的设备名称,只在每组的首行显示,这样报表看起来会非常规整。
实用方案示例
方案1:用Pivot实现横向合并(以网卡MAC地址为例)
先给每个设备的网卡编个序号,再通过Pivot转置成列:
WITH NicCTE AS ( SELECT SYS.Netbios_Name0, SYS.ResourceID, Netcard.MACAddress0, Netcard.Description0, -- 按设备分组,给每个网卡编序号 ROW_NUMBER() OVER (PARTITION BY SYS.ResourceID ORDER BY Netcard.Description0) AS NicSequence FROM v_R_System SYS JOIN v_GS_NETWORK_ADAPTER Netcard ON SYS.ResourceID = Netcard.ResourceID ) SELECT Netbios_Name0, [1] AS Nic1_MAC, [1] AS Nic1_Description, [2] AS Nic2_MAC, [2] AS Nic2_Description -- 可以继续扩展[3]、[4],根据你的环境中最多网卡数调整 FROM NicCTE PIVOT ( MAX(MACAddress0) FOR NicSequence IN ([1], [2]) ) AS PivotMAC PIVOT ( MAX(Description0) FOR NicSequence IN ([1], [2]) ) AS PivotDesc;
方案2:用SSRS分组简化展示
- 在SSRS报表的数据集里保留你原来的SQL查询;
- 设计报表时,把
Netbios_Name0添加为行组; - 选中设备名称的文本框,在「属性」里找到「重复项」,设置为「不重复」;
- 可以给组添加折叠功能,让用户可以展开/查看同一设备的所有硬件细节。
额外提醒
如果你的查询同时关联了多个多实例表(比如网卡+硬盘),一定要注意避免笛卡尔积(比如2个网卡×2个硬盘会生成4行记录)。这种情况建议先分别处理每个多实例表(比如用CTE先整理好网卡信息,再整理好硬盘信息),最后再关联到主设备表。
内容的提问来源于stack exchange,提问作者Blurn
相关产品推荐
相关产品推荐

