SQL查询为同一个键返回多行 - pivot?

时间:2018-03-28 17:07:47

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

我正在尝试使用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语句限制)。我要搜索的两个网络适配器将返回但在各行上:

current results

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

example of what I am hoping to achieve

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

1 个答案:

答案 0 :(得分:0)

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

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

像你使用的表" Matrix"控制RDL并将数据集绑定到Matrix控件,并在列组中添加要显示为pivot的列名 并检查报告