2014-01-12 3 views
1

내가 3 개 테이블이 피벗 테이블과 그립에 도착 할 수 없습니다피벗 테이블 SQL 서버 2008

AccidentType :

AccidentTypeID Description 
1    Type1 
2    Type2 
3    Type3 
4    Type4 

CaseAccidentType :

AccidentTypeID CaseID 
1    1000 
2    1000 
3    1001 

케이스 :

CaseID Name 
1000 Case A 
1001 Case B 

사례가 주요 탭입니다. e와 caseaccidenttype을 사고 유형에 대한 링크 테이블로 사용하십시오. 각각의 경우에는 여러 가지 사고 유형이있을 수 있습니다.

CaseID Name Type1 Type2 Type3 Type4 
1000 Case A True True False False 
1001 Case B False False True False 

피벗 테이블처럼 보이지만 단지 문이 안 열려도 그것을 :

내가 좋아하는 뭔가를 원한다.

업데이트 : 동적으로 열 머리글을 생성 할 수있는 많은 AccidentType이 있습니다.

+1

항상 1,2,3,4가 될까요? 아니면 더 될 수 있을까요? 제한 없음? – MrSimpleMind

+0

다양한 유형이 있습니다. 유형을 하드 코딩하지 않고이 작업을 수행 할 수 있습니까? – Jammy

답변

1

테스트 데이터

DECLARE @AccidentType TABLE(AccidentTypeID INT, [Description] NVARCHAR(100)) 
INSERT INTO @AccidentType VALUES 
(1,'Type1'),(2,'Type2'),(3,'Type3'),(4,'Type4') 

DECLARE @CaseAccidentType TABLE(AccidentTypeID INT,CaseID INT) 
INSERT INTO @CaseAccidentType VALUES 
(1,1000),(2,1000),(3,1001) 

DECLARE @Case TABLE(CaseID INT, Name NVARCHAR(100)) 
INSERT INTO @Case VALUES 
(1000,'Case A'),(1001,'Case B') 

쿼리

;With CTE 
AS(
    SELECT * 
    FROM 
    (
    SELECT C.CaseID,C.Name, AT.[Description] 
    FROM @Case C INNER JOIN @CaseAccidentType CAT 
    ON  C.CaseID = CAT.CaseID 
    INNER JOIN @AccidentType AT 
    ON  CAT.AccidentTypeID = AT.AccidentTypeID 
    ) Q 
     PIVOT 
      (MAX(Name) 
      FOR [Description] 
      IN ([Type1],[Type2],[Type3],[Type4]) 
      )Pv 
) 
SELECT CT.CaseID 
     ,C.Name 
     ,CASE WHEN CT.Type1 IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS Type1 
     ,CASE WHEN CT.Type2 IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS Type2 
     ,CASE WHEN CT.Type3 IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS Type3 
     ,CASE WHEN CT.Type4 IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS Type4 
FROM CTE CT INNER JOIN @Case C 
ON CT.CaseID = C.CaseID 

결과 설정

╔════════╦════════╦═══════╦═══════╦═══════╦═══════╗ 
║ CaseID ║ Name ║ Type1 ║ Type2 ║ Type3 ║ Type4 ║ 
╠════════╬════════╬═══════╬═══════╬═══════╬═══════╣ 
║ 1000 ║ Case A ║ TRUE ║ TRUE ║ FALSE ║ FALSE ║ 
║ 1001 ║ Case B ║ FALSE ║ FALSE ║ TRUE ║ FALSE ║ 
╚════════╩════════╩═══════╩═══════╩═══════╩═══════╝ 
+1

@ BogdanSahlean 하하하가 환호하는 친구 야. –

+0

지난 쿼리에서 이름 필드에 가입했다는 사실을 알았습니다. 이름 필드가 고유하지 않아도 계속 작동합니까? – Jammy

+0

@ Jammy는 이제 코드를 약간 수정하여 CaseID 필드에 가입 할 수있게되었습니다. 그것이 uinque 필드가 아니라면이 마지막 솔루션은 당신의 재밌는 결과를 줄 수 있습니다. 어쨌든 당신의 요구 사항에 맞는 솔루션을 업데이트했습니다. 지금보십시오 그리고 대답을 받아 들일 수 있다면 :) –

0

또 다른 방법 -

SELECT C.CaseID,C.[Name],AT.[Description] 
INTO #NO_PIVOT 
FROM [Case] C 
INNER JOIN CaseAccidentType CAT 
    ON CAT.CaseID = C.CaseID 
INNER JOIN AccidentType AT 
    ON AT.AccidentTypeID = CAT.AccidentTypeID 

SELECT 
    CaseID 
    ,[Name] 
    ,CASE WHEN SUM(Type1) > 0 THEN CAST('True' AS VARCHAR(5)) ELSE 'False' END AS [Type1] 
    ,CASE WHEN SUM(Type2) > 0 THEN CAST('True' AS VARCHAR(5)) ELSE 'False' END AS [Type2] 
    ,CASE WHEN SUM(Type3) > 0 THEN CAST('True' AS VARCHAR(5)) ELSE 'False' END AS [Type3] 
    ,CASE WHEN SUM(Type4) > 0 THEN CAST('True' AS VARCHAR(5)) ELSE 'False' END AS [Type4] 
FROM 
( SELECT 
     CaseID 
     ,[Name] 
     ,CASE WHEN [Description] = 'Type1' AND ISNULL((SELECT COUNT(1) FROM #NO_PIVOT WHERE CaseID = NP.CaseID AND [Name] = NP.[Name]),-1) > 0 
      THEN 1 ELSE 0 END AS [Type1] 
     ,CASE WHEN [Description] = 'Type2' AND ISNULL((SELECT COUNT(1) FROM #NO_PIVOT WHERE CaseID = NP.CaseID AND [Name] = NP.[Name]),-1) > 0 
      THEN 1 ELSE 0 END AS [Type2] 
     ,CASE WHEN [Description] = 'Type3' AND ISNULL((SELECT COUNT(1) FROM #NO_PIVOT WHERE CaseID = NP.CaseID AND [Name] = NP.[Name]),-1) > 0 
      THEN 1 ELSE 0 END AS [Type3] 
     ,CASE WHEN [Description] = 'Type4' AND ISNULL((SELECT COUNT(1) FROM #NO_PIVOT WHERE CaseID = NP.CaseID AND [Name] = NP.[Name]),-1) > 0 
      THEN 1 ELSE 0 END AS [Type4] 
    FROM #NO_PIVOT NP 
)RESULTSET 
GROUP BY CaseID, [Name]