2016-11-07 7 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]ブロックにプログラム名を手動で入力する必要があります。プログラムは可変である場合は、迅速なダイナミックな条件付きの集約が

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を助けるかもしれない

1

(IIRCダイナミックピボットに関連したSEの質問がたくさんあります)クエリを作成するには、動的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'が一重引用符で囲まれていれば、壊れてしまいます。 –

関連する問題