2014-07-17 2 views
0

아래 이미지에서 설명한대로 출력을 얻으려면 몇 가지 테이블을 병합하려고합니다.SQL 병합 테이블

enter image description here

내 문제는 내가

사람이 구문을 도와 주실 것을 달성하기 위해 사용하는 조인의 종류 모르겠습니다이다.

+0

당신은 ['PIVOT'] (HTTP를 사용해야 할 수도 있습니다 : // www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query) – valverij

+0

얼마나 많은 테스트 대 얼마나 많은 사용자가 논리적으로 당신이 출력의 행과 열을 바꾸고 싶어한다고 생각하십니까? . 이 보고서를 출력하기 위해 당신은 무엇을 사용하고 있습니까? –

+0

질문에 대한 데이터를 사용 가능한 형식으로 게시하십시오. 이상적으로, F5- 준비'create table'과'insert' 문. 지금 나는 단지 'PIVOT'과'FULL OUTER JOIN'에 대한 힌트를 줄 것입니다. –

답변

3

사용자가 추가/삭제할 수있는 동적 피벗입니다.

CREATE TABLE #Tests (
    Test_ID INT, 
    TestName VARCHAR(50)); 
INSERT INTO #Tests VALUES (1, 'SQL Test'); 
INSERT INTO #Tests VALUES (2, 'C# Test'); 
INSERT INTO #Tests VALUES (3, 'Java Test'); 
CREATE TABLE #Users (
    [User_ID] INT, 
    UserName VARCHAR(50)); 
INSERT INTO #Users VALUES (1, 'Joe'); 
INSERT INTO #Users VALUES (2, 'Jack'); 
INSERT INTO #Users VALUES (3, 'Jane'); 
CREATE TABLE #UserTests (
    ID INT, 
    [User_ID] INT, 
    Test_ID INT, 
    Completed INT); 
INSERT INTO #UserTests VALUES (1, 1, 1, 0); 
INSERT INTO #UserTests VALUES (2, 1, 2, 1); 
INSERT INTO #UserTests VALUES (3, 1, 3, 1); 
INSERT INTO #UserTests VALUES (4, 2, 1, 0); 
INSERT INTO #UserTests VALUES (5, 2, 2, 0); 
INSERT INTO #UserTests VALUES (6, 2, 3, 0); 
INSERT INTO #UserTests VALUES (7, 3, 1, 1); 
INSERT INTO #UserTests VALUES (8, 3, 2, 1); 
INSERT INTO #UserTests VALUES (9, 3, 3, 1); 
DECLARE @Cols VARCHAR(MAX); 
SELECT @Cols = STUFF((SELECT distinct ',' + QUOTENAME(u.UserName) 
      FROM #Users u 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 
DECLARE @Query NVARCHAR(MAX); 
SELECT @Query = 'SELECT TestName, ' + @Cols + ' FROM 
(
    SELECT 
     t.TestName, 
     u.UserName, 
     ut.Completed 
FROM 
    #Tests t 
    INNER JOIN #UserTests ut ON ut.Test_ID = t.Test_ID 
    INNER JOIN #Users u ON u.[User_ID] = ut.[User_ID]) x 
    PIVOT (
     MAX(Completed) 
     FOR UserName IN (' + @Cols + ') 
    ) AS pt'; 
EXEC(@Query); 

결과는 다음과 같습니다

TestName Jack Jane Joe 
C# Test  0  1  1 
Java Test 0  1  1 
SQL Test 0  1  0 

(동일 당신과 같은 결과를하지만, 다른 정렬 순서에.)

+0

예 사용자를 추가/삭제할 수 있습니다. 나는 위의 것을 시도 할 것이다. 감사 –