2015-01-23 5 views
0

여러 열에서 피벗을 사용하려고합니다. 현재, 단 하나의 컬럼으로이 작업을 수행 할 수 있습니다. 나의 현재 메소드가 리턴 : 여기SQL 서버 다중 열 피벗 - 다른 차원

Membership Item1 
DO1   400 
Neither  21 
Plan A  69 
Plan B  53 

그러나 나는 달성하기 위해 노력하고 무엇 :

여기
Membership Item1 Item2 Item3 Item3 Item4 Item5 
DO1   30  300  25  14  10  144 
Neither  35  250  30  30  5  125 
Plan A  50  100  25  25  5  254 
Plan B  100  25  15  25  4  123 

내 코드

WITH CTE_SQL 
AS 
(
    SELECT CaseId 
      ,Item1 AS Number1 
      ,[Membership] -- ,Item2 AS Number2,Item3 AS Number3,Item4 AS Number4,Item5 AS Number5 
      FROM TABLE1 
      WHERE [Membership] IS NOT NULL 
) 
SELECT [Membership] 
     ,Item1 --,Item2--,Item3 AS 'Item3',Item4 AS 'Item4',Item5 AS 'Item5' 
FROM 
(
    SELECT CaseId 
      ,Number1 
      ,[Membership] --,[Item2],[Item3],[Item4],[Item5] 
      FROM CTE_SQL 
) AS p 
PIVOT 
(
    COUNT(CaseId) 
    FOR Number1 IN (Item1) 
) AS pvt 
ORDER BY [Membership] 

어떤 통찰력입니까? 여기에 업데이트 것은

ColumnName DataType Allow Nulls 
.......... ........ ........... 
CaseId nvarchar(50)  No 
Membership nvarchar(50) Yes 
Item1  nvarchar(50)  Yes 
Item2  nvarchar(50)  Yes 
Item3  nvarchar(50)  Yes 
Item4  nvarchar(50)  Yes 
Item5  nvarchar(50)  Yes 

그래서 여기에 테이블 스키마에게 내 마지막 업데이트입니다. 지금까지이

CREATE TABLE TABLE1 
(CASENumber NVARCHAR(50),Membership NVARCHAR(50),Item1 NVARCHAR(50),Item2 NVARCHAR(50),Item3 NVARCHAR(50),Item4 NVARCHAR(50),Item5 NVARCHAR(50)) 

INSERT INTO TABLE1 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 

그리고 여기 내 코드와 출력 붙어 있었다 :

WITH CTE_SQL 
    AS 
    (
     SELECT CASENumber,Item1 AS Number1,[Membership]--,Item2 AS Number2, 
     Item3 AS Number3,Item4 Number4,Item5 AS Number5 
     FROM dbo.TABLE1 
     WHERE [Membership] IS NOT NULL 

) 
    SELECT Membership,Gold as 'Item1' --,Item2--,Item3 AS 'Item3', 
    Item4 AS 'Item4',Item5 AS 'Item5' 
    FROM 
    (
     SELECT CaseNumber,Number1,Membership--,[Item2],[Item3],[Item4],[Item5] 
     FROM CTE_SQL 
    ) AS p 
    PIVOT 
    (
     COUNT(CASENumber) 
     FOR Number1 in(Gold) 
    ) as pvt 

전류 출력

Membership Item1 
......... ..... 
D01   7 
Neither  9 
PlanA   4 
PlanB  13 

의도 된 출력이 내 소스 데이터입니다

Membership Item1 Item2 Item3 Item4 Item5 
.......... ..... ..... ..... ..... ..... 
D01   7  7  7  7  7 
Neither  9  9  9  9  9 
PlanA  4  4  4  4  4 
PlanB  13  13  13  13  13 

항목 1 열의 모든 요소는 금입니다. 항목 2-5에 대해서도 Silver, Diamond, SteelWood으로 각각 적용됩니다.

+0

당신은 샘플 데이터를 제공 할 수 있습니까? –

+0

샘플 데이터는 코드 – user3424320

+0

앞에 나와 있습니다. 예상 한 결과라고 생각 했습니까? –

답변

0

결과를 얻으려면 동적 피벗이 필요합니다.

012 :

선언 변수는

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Number1 + ']', '[' + Number1 + ']') 
        FROM (SELECT DISTINCT Number1 FROM #TEMP) PV 
        ORDER BY Number1 

지금

편집 결과

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT Membership, Number1, 
       -- Get the count here 
       COUNT(CASEID) OVER(PARTITION BY Membership,Number1) CNT 
       FROM #TEMP 
       WHERE Membership IS NOT NULL 
      ) x 
      PIVOT 
      (
       MIN(CNT) 
       FOR Number1 IN (' + @cols + ') 
      ) p 
      ORDER BY Membership;' 

EXEC SP_EXECUTESQL @query 
  • Click here이 볼 수있는 쿼리를 피벗 피벗의 열을 얻을 수 각 구성원에 대해 CaseId의 수를 필요로하는 경우 3,516,

    당신의 갱신 당으로, 당신은 결과

    ;WITH CTE AS 
    (
        SELECT DISTINCT Membership, 
        COUNT(CASEID) OVER(PARTITION BY Membership) CNT 
        FROM TABLE1 
        WHERE Membership IS NOT NULL 
    ) 
    SELECT Membership,CNT AS Item1,CNT AS Item2,CNT AS Item3,CNT AS Item3,CNT AS Item4,CNT AS Item5 
    FROM CTE 
    
    • Click here이 볼 수있는 아래의 쿼리를 사용할 수

    편집 2 :

    친애하는 친구. 이것은 쉬운 과정입니다. 우리는 선회없이 할 수 있습니다.Sql ServerPARTITION BY() 메서드를 사용할 수 있으며 Membership에 대해 각각 CASENUMBER의 총 개수를 얻을 수 있습니다.

    SELECT DISTINCT [Membership], 
    COUNT(Item1) OVER(PARTITION BY [Membership]) AS Item1, 
    COUNT(Item2) OVER(PARTITION BY [Membership]) AS Item2, 
    COUNT(Item3) OVER(PARTITION BY [Membership]) AS Item3, 
    COUNT(Item4) OVER(PARTITION BY [Membership]) AS Item4, 
    COUNT(Item5) OVER(PARTITION BY [Membership]) AS Item5 
    FROM TABLE1 
    WHERE [Membership] IS NOT NULL 
    ORDER BY MEMBERSHIP 
    

    결과

    x-------------x-----------x----------x----------x---------x---------x 
    | Membership | Item1 | Item2 | Item3 | Item4 | Item5 | 
    x-------------x-----------x----------x----------x---------x---------x   
    | D01  |  7 | 7  |  7 | 7 |  7 | 
    | Neither |  9 | 9  |  9 | 9 |  9 | 
    | Plan A |  4 | 4  |  4 | 4 |  4 | 
    | Plan B |  13 | 13 | 13 | 13 | 13 | 
    x-------------x-----------x----------x----------x---------x---------x 
    
+0

감사하지만 내 쿼리 원래 쿼리를 보면 item1 (및 주석이 달린 item2 -item5)이 실제 열입니다. 솔루션에는 Number1 만 있습니다. (30), NUMBER1 VARCHAR (30), NUMBER2 VARCHAR (30), NUMBER3 VARCHAR (30), NUMBER4 VARCHAR (30), NUMBER5 VARCHAR (30), CREATE TABLE TEMP (CASEID INT, 멤버십 VARCHAR) – user3424320

+0

각 멤버쉽의 Case_id 수를 소스 테이블 (Table1)에서 가져 오시겠습니까? @ user3424320 –

+0

그게 내 의도입니다. – user3424320