2016-11-07 1 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'에 작은 따옴표가 있으면 깨질 것입니다. –