我正在尝试编写一个查询来确定计算机上安装的版本。数据库设置如下。
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
我听说过数据透视表和子查询,但我不能为我的生活弄清楚。任何帮助,将不胜感激。我一直看到将值加起来或最小值的响应。我只是想重新订购清单。
答案 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