2015-01-05 4 views
-1

ComuterName 한 행을 반환하는 쿼리를 갖고 싶습니다. 행에는 조회 된 응용 프로그램과 해당 버전이 있어야합니다.Sql 이중 행 여러 열 선택

SELECT DISTINCT 
    dbo.v_R_System.Name0 [ComputerName], 
    dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 [App], 
    dbo.v_GS_ADD_REMOVE_PROGRAMS.Version0 
FROM 
    dbo.v_R_System 
    INNER JOIN dbo.v_GS_ADD_REMOVE_PROGRAMS 
    ON dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID 
    INNER JOIN dbo.v_R_User 
    ON dbo.v_R_System.User_Name0 = dbo.v_R_User.User_Name0 
    INNER JOIN dbo.v_GS_COMPUTER_SYSTEM 
    ON dbo.v_R_System.Name0 = dbo.v_GS_COMPUTER_SYSTEM.Name0 
    INNER JOIN v_GS_PC_BIOS 
    ON dbo.v_R_System.ResourceID = dbo.v_GS_PC_BIOS.ResourceID 
WHERE 
    dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%MS Word%' 
    OR dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Adobe Reader%' 
    OR dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Flash Player%' 

반환이 : 내 현재 쿼리

╔══════════════╦════════════════════╦═════════╗ 
║ ComputerName ║  App   ║ Version ║ 
╠══════════════╬════════════════════╬═════════╣ 
║ PC1   ║ MS Word   ║ 12  ║ 
║ PC1   ║ Adobe Reader  ║ 10.0.10 ║ 
║ PC1   ║ Adobe Flash Player ║ 15.1 ║ 
║ PC2   ║ MS Word   ║ 15  ║ 
║ PC2   ║ Adobe Reader  ║ 11.0.07 ║ 
║ PC2   ║ Adobe Flash Player ║ 16  ║ 
╚══════════════╩════════════════════╩═════════╝ 

나는이 방식으로 정보를 반환하고 싶습니다 :

╔══════════════╦═════════╦═════════╦══════════════╦═════════╦════════════════════╦═════════╗ 
║ ComputerName ║ App1 ║ App1Ver ║  App2  ║ App2Ver ║  App3  ║ App3Ver ║ 
╠══════════════╬═════════╬═════════╬══════════════╬═════════╬════════════════════╬═════════╣ 
║ PC1   ║ MS Word ║  12 ║ Adobe Reader ║ 10.0.10 ║ Adobe Flash Player ║ 15.1 ║ 
║ PC2   ║ MS Word ║  15 ║ Adobe Reader ║ 11.0.07 ║ Adobe Flash Player ║ 16  ║ 
╚══════════════╩═════════╩═════════╩══════════════╩═════════╩════════════════════╩═════════╝ 

이 데이터베이스는 SQL 서버 2008 R2에 저장됩니다.

미리 감사드립니다.

+3

어떤 데이터베이스를 사용하고 있습니까? 이 개념은 PIVOT으로 알려져 있으며 구문은 제품에 따라 다를 수 있습니다. – Taryn

+0

이 데이터베이스는 SQL Server 2008 R2에 저장됩니다. –

답변

0

당신이 case based aggregation을 사용할 수 있습니다, 당신은 인덱스가 사용되지 않고는 대용량 데이터에 느린가

이 사용하는 것이 더 좋을 것이다을 설정 될 것입니다 % 와일드 카드를 사용하고 여기에 like 또 다른 문제가있는 것입니다 그룹 아이디 열 및 응용 프로그램 이름과 그룹 사이의 매핑 테이블을 가지며 쿼리에서 그룹 아이디를 사용합니다.

SELECT 
    dbo.v_R_System.Name0 [ComputerName], 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%MS Word%' then 'MS Word' end) as App1, 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%MS Word%' then dbo.v_GS_ADD_REMOVE_PROGRAMS.Version0 end) as App1Ver 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Adobe Reader%' then 'Adobe Reader' end) as App1, 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Adobe Reader%' then dbo.v_GS_ADD_REMOVE_PROGRAMS.Version0 end) as App2Ver 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Flash Player%' then 'Flash Player' end) as App1, 
    max(case when dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 LIKE '%Flash Player%' then dbo.v_GS_ADD_REMOVE_PROGRAMS.Version0 end) as App3Ver 

FROM 
    dbo.v_R_System 
    INNER JOIN dbo.v_GS_ADD_REMOVE_PROGRAMS 
    ON dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID 
    INNER JOIN dbo.v_R_User 
    ON dbo.v_R_System.User_Name0 = dbo.v_R_User.User_Name0 
    INNER JOIN dbo.v_GS_COMPUTER_SYSTEM 
    ON dbo.v_R_System.Name0 = dbo.v_GS_COMPUTER_SYSTEM.Name0 
    INNER JOIN v_GS_PC_BIOS 
    ON dbo.v_R_System.ResourceID = dbo.v_GS_PC_BIOS.ResourceID 
group by dbo.v_R_System.Name0 
+0

고맙습니다, 레이더. 그게 바로 제가 찾고 있던 것입니다. 쿼리 성능이 자주 실행되지 않으므로 쿼리 성능에 너무 신경을 쓰지 않습니다. –