2016-11-07 2 views
0

Я пытаюсь написать запрос, чтобы выяснить версии, установленные на машинах. база данных настроена следующим образом.SQL 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 

Я слышал о сводных таблицах и вложенных запросах, но я не могу за жизнь мне понять это. Любая помощь будет оценена по достоинству. Я продолжаю видеть ответы, которые добавляют значения или min max значения. Я просто пытаюсь переупорядочить список.

+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-Сформирован следует a

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' имеет одинарные кавычки в нем. –