2016-11-07 55 views
0

我試圖編寫一個查詢來計算機器上安裝的版本。數據庫就像這樣安裝。SQL數據透視表幫助或可能的其他解決方案

machine name | Program Name | Version 
Machine1   Program1  5.0 
Machine1   Program2  4.6 
Machine1   Program3  15.2 
Machine2   Program1  4.9 
Machine2   Program2  4.6 
Machine2   Program3  15.1 

我想他們是這樣

Machinename | Program1 Version | Program2 Version | Program3 Version 
Machine1   5.0    4.6    15.2 
Machine2   4.9    4.6    15.1 

我聽說透視表和子查詢的輸出,但我不能爲我的生命數字出來。任何幫助,將不勝感激。我不斷看到加起來的值或最小值。我只是試圖重新排列名單。

+1

發佈你嘗試過的一些代碼,你可能會接近。它可以幫助每個人看到你的工作來幫助你。 – miltonb

回答

1

這個怎麼樣? http://rextester.com/OHASM46132

SELECT * 
FROM (
    SELECT 
     [machine], 
    Program, 
     Version 
    FROM tbl 
) as s 
PIVOT 
(
    max(version) 
    FOR [Program] IN (program1, program2, program3) 
)AS pvt 

幾件事情:使用樞軸,該值必須是一個聚集體(計數,最大值,總和,等等)。您必須在FOR [Program]塊中手動輸入程序名稱。如果程序是可變的,你可以使用動態SQL創建查詢(有很多相關的動態支點SE問題,IIRC)

1

快速動態條件聚合可以幫助

Declare @SQL varchar(max)='' 
Select @SQL = @SQL+char(13)+','+QUOTENAME(ProgramName+' Version')+'=max(case when ProgramName='''+ProgramName+''' then Version else null end)' 
From (Select Distinct ProgramName from YourTable) A 
Order By ProgramName 

Select @SQL='Select MachineName'[email protected]+' From YourTable Group By MachineName' 
Exec(@SQL) 

生成的SQL是一個如下

Select MachineName 
    ,[Program1 Version]=max(case when ProgramName='Program1' then Version else null end) 
    ,[Program2 Version]=max(case when ProgramName='Program2' then Version else null end) 
    ,[Program3 Version]=max(case when ProgramName='Program3' then Version else null end) 
From YourTable 
Group By MachineName 
+0

如果'ProgramName'中有單引號,這將會中斷。 –

相關問題