2013-11-27 70 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