2016-11-07 38 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'中有单引号,这将会中断。 –

相关问题