如何创建数据透视表查询?

时间:2013-11-27 21:35:17

标签: mysql sql sql-server

对于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 个答案:

答案 0 :(得分:1)

如果您只有theese tree应用程序,则应执行以下操作:

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 ,您必须适应您的问题。