SQL Pivot Table帮助或可能的其他解决方案

时间:2016-11-07 19:38:16

标签: sql subquery pivot ssms pivot-table

我正在尝试编写一个查询来确定计算机上安装的版本。数据库设置如下。

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

我听说过数据透视表和子查询,但我不能为我的生活弄清楚。任何帮助,将不胜感激。我一直看到将值加起来或最小值的响应。我只是想重新订购清单。

2 个答案:

答案 0 :(得分: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

一些事情:使用数据透视表,值必须是聚合(Count,max,sum等)。您必须在FOR [Program]块中手动输入程序名称。如果程序是可变的,您可以使用动态SQL来创建查询(有很多与动态数据透视相关的SE问题,IIRC)

答案 1 :(得分: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'+@SQL+' From YourTable Group By MachineName'
Exec(@SQL)

SQL Generated是以下

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