【问题标题】:SQL query is returning multiple rows for the same key - pivot?SQL 查询为同一个键返回多行 - 枢轴?
【发布时间】:2018-03-28 17:07:47
【问题描述】:

我正在尝试使用 SSRS 从我的 SCCM SQL 数据库创建报告。我在 SSRS 中运行的 SQL 查询如下所示:

SELECT 
    SYS.Netbios_Name0, 
    SYS.User_Name0, 
    OPSYS.Caption0 as Caption, 
    OPSYS.Version0,
    CSYS.Model0,
    Netcard.Description0, 
    Netcard.MACAddress0, 
    Netcard.Manufacturer0,
    BIOS.SerialNumber0 as 'BiosSerial0',
    WD.SerialNumber0 as 'WDSerial0',
    ENC.SMBIOSAssetTag0,
    WD.LastUpdate0,
    CONVERT(VARCHAR(11), wd.WarrantyStartDate0, 106) as WarrantyStartDate0,
    CONVERT(VARCHAR(11), wd.WarrantyEndDate0, 106) as WarrantyEndDate0

FROM 
    fn_rbac_R_System(@UserSIDs)  SYS
    LEFT JOIN  fn_rbac_GS_X86_PC_MEMORY(@UserSIDs)  MEM on SYS.ResourceID = MEM.ResourceID
    LEFT JOIN  fn_rbac_GS_COMPUTER_SYSTEM(@UserSIDs)  CSYS on SYS.ResourceID = CSYS.ResourceID
    LEFT JOIN  fn_rbac_GS_PROCESSOR(@UserSIDs)  Processor  on Processor.ResourceID = SYS.ResourceID
    LEFT JOIN  fn_rbac_GS_OPERATING_SYSTEM(@UserSIDs)  OPSYS on SYS.ResourceID=OPSYS.ResourceID
    LEFT JOIN  fn_rbac_GS_PC_BIOS(@UserSIDs) BIOS on SYS.ResourceID=BIOS.ResourceID
    LEFT JOIN  fn_rbac_GS_SYSTEM_ENCLOSURE(@UserSIDs) ENC on SYS.ResourceID=ENC.ResourceID
    LEFT JOIN  fn_rbac_GS_NETWORK_ADAPTER(@UserSIDs) Netcard ON SYS.ResourceID = Netcard.ResourceID
    INNER JOIN fn_rbac_GS_WESLEYANDEVICE(@UserSIDs) WD on SYS.ResourceID=WD.ResourceID

WHERE     (Netcard.Description0 LIKE '%I219-V%') OR (Netcard.Description0 LIKE '%Wireless-AC 8265%') AND (Netcard.MACAddress0 IS NOT NULL)

ORDER BY WD.WarrantyEndDate0 ASC

此查询返回我想要的结果,但它为 Netcard 字段中的每个结果创建了一个新行,包括一些重复的信息。例如,我有一台具有多个网络接口的计算机(受我上面的 WHERE 语句限制)。我正在搜索的两个网络适配器被返回但在单独的行上:

我希望每台计算机只有一行,而 Netcard 字段返回的数据将位于同一行的新列中。我不确定如何进行,因为我不精通 SQL 或 DBA。我假设这将是一个支点,但我不确定如何做到这一点(特别是键控)。这是我希望实现的一个例子:

感谢您帮助我找到最好的方法。

【问题讨论】:

  • 你能在你的 select 子句中添加 DISTINCT 吗?
  • 你知道机器上最多可以放多少张卡吗?
  • @Shawn 谢谢,我将使用 PIVOT 进行检查。每台机器中只有两个适配器。但是,我正在查看结果,最多列出 4 个 MAC 地址(2 个用于有线,2 个用于无线) - 可能来自某种修复/交换。大多数结果有两个。我确实遇到了一些重复...一台机器列出了 10 个 mac 地址。我认为 SCCM 在数据库中有一些垃圾。
  • 神圣功能!!!看起来有些事情在设计中出现了问题。您在这里有一个又一个的函数,并且它们每个都接收到似乎是分隔字符串的内容。如果您在此处需要真正的帮助,则必须提供一些详细信息。所有这些功能在做什么?然后您将需要一个动态数据透视表或动态交叉表。

标签: sql sql-server reporting-services sql-server-2016 sccm


【解决方案1】:

使用此数据集结果,您还可以管理 ssrs 报告中的数据透视,即您可以在 ssrs 报告工具中创建数据透视。

创建新的 .RDL 文件并创建新数据集以访问要显示的报表数据。

像表格一样,您在 RDL 上使用“矩阵”控件并将数据集绑定到矩阵控件,并在列组中添加要显示为枢轴的列名 并查看报告

【讨论】:

  • 我认为这个答案是假设我有 Visual Studio 可用于 SSDT 集成。幸运的是,我有它,并且会给矩阵控制一个机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2017-06-02
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多