2013-11-27 30 views
0

需要一些帮助来为SQL Server 2008上的以下方案提供数据透视表。我通常不会做比基本SQL查询更多的操作,而且这个查询让我有点难住。如何创建数据透视表查询?

查看#1 - v_R_System(需要从这里NAME0列) 查看#2 - v_GS_ADD_REMOVE_PROGRAMS(需要DisplayName0从这里)

非关键查询看起来是这样的:

SELECT DISTINCT sys.Name0 AS [SYSTEM NAME], arp_x86.DisplayName0 AS [ADD/REMOVE PROGRAMS] 
FROM   v_R_System AS sys LEFT OUTER JOIN 
         v_GS_ADD_REMOVE_PROGRAMS AS arp_x86 ON sys.ResourceID = arp_x86.ResourceID 
WHERE  (sys.Name0 LIKE 'SRV%') 
GROUP BY arp_x86.DisplayName0, sys.Name0 

结果从上面的查询中只显示两列,一列用于系统名称,另一列用于添加/删除程序数据。

System Name  Add/Remove Programs 
------------------------------------ 
SRV01   APP01 
SRV01   APP02 
SRV01   APP03 
SRV02   APP01 
SRV02   APP03 

的问题是,我们得到每个服务器的多个行,所以我们想,而不是什么是有1行中的每个服务器,但有在顶部显示,然后软件列表中把“*”的一个软件列,如果它安装在特定的服务器上。

System Name  APP01  APP02  APP03 
------------------------------------------ 
SRV01    *   *   * 
SRV02    *     * 

任何帮助非常感谢!

谢谢。

+1

它是mysql还是sql-server?请选择一个,然后拿出另一个标签。 –

+1

是服务器数量有限吗?或可以无限? –

+0

[PIVOT](http://technet.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx)可以在这里显示,只要您知道列的名称即可将在应用之后形成。 – user2989408

回答

1

如果刚theese树应用这应该这样做:

select 
     sys.Name0, 
     max(case arp_x86.DisplayName0 
       when 'APP01' then arp_x86.DisplayName0 else '' end) as APP01, 
     max(case arp_x86.DisplayName0 
       when 'APP02' then arp_x86.DisplayName0 else '' end) as APP02, 
     max(case arp_x86.DisplayName0 
       when 'APP03' then arp_x86.DisplayName0 else '' end) as APP03 
    from v_R_System AS sys 
      LEFT OUTER JOIN v_GS_ADD_REMOVE_PROGRAMS AS arp_x86 
        ON sys.ResourceID = arp_x86.ResourceID 
where sys.Name0 LIKE 'SRV%' 
group by sys.Name0 

这仅仅是一个SQL的方式来做到这一点。

对于动态PIVOT表,你可以看到这个answer,你将不得不适应你的问题。

+0

我刚刚列出这些例子,每个服务器可能有30个应用程序或更多。 – user1580685

+0

然后一个程序是一种适合你的方式! –

+0

但是,如果应用程序列表未知,它将如何工作?某些服务器可能有30个,其他35个,其他28个等等。看起来这种方法只有在将每个应用程序列为已知应用程序时才有效。解决方案需要动态。 – user1580685