2012-03-03 2 views
0

하면 SQL 서버 전문가를위한 또 하나의 열으로 일부 행 ...스왑 SQL 서버 2008

나는 액션 열이 많은 다른 유형이있을 수 있습니다

AccountManager | Action    | Count 
----------------------------------------------------- 
Joe   | Client Negotiation | 10 
Bloggs   | Closing    | 1 
Aunty   | Email     | 12 
Marie   | Preparing Contract | 32 

... 테이블과 같이가 반드시 고정되어 있지 않은 상태의

AccountManager | Client Negotiation | Closing | Email | Preparing Contract 
-------------------------------------------------------------------------- 
Joe   | 10     | 0  | 0  | 0 
Bloggs   | 0     | 1  | 0  | 0 
Aunty   | 0     | 0  | 12 | 0 
Marie   | 0     | 0  | 0  | 32 

방법이 달성 될 수있다 :

나는 다음으로 출력을해야합니까? 도움!

+0

[무엇을 시도해 봤습니까?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

AccountManager를 사용하여 원본 테이블을 가져 왔지만, Action, Count 열은 필요한 테이블을 얻기 위해 생각할 수있는 유일한 방법이지만 커서를 사용하여이를 피하는 것입니다. 필자는이를 피하고 싶습니다. – AshesToAshes

+0

질문이 왜 투표로 남았습니까? – AshesToAshes

답변

0

이것은 사용중인보고 도구에서 가장 잘 처리됩니다. '피벗 테이블'을 찾습니다.

첫 번째 테스트 데이터 :

+0

어떤보고 도구입니까? 나는 순수한 SQL에서 이것을하고있다 ... – AshesToAshes

1
select [AccountManager], ISNULL([Email],0) as [Email], ISNULL([Closing],0) as [Closing], ISNULL([Preparing Contact],0) as [Preparing Contact], ISNULL([Client Negotiation],0) as [Client Negotiation] from 
    (SELECT * FROM TestPivot) as SourceTable 

Pivot 
(
    SUM([Count]) 
    For [Action] in ([Email], [Closing], [Preparing Contact], [Client Negotiation]) 
) as PivotedColumns 
order by [Email] desc, [Closing] desc, [Preparing Contact] desc, [Client Negotiation] desc 
1

어쩌면 무언가를 따라

CREATE TABLE #tbl (AccountManager VARCHAR(100), Action VARCHAR(100),Count INT) 

INSERT INTO #tbl 
VALUES 
    ('Joe','Client Negotiation',10), 
    ('Bloggs','Closing',1), 
    ('Aunty','Email',12), 
    ('Marie','Preparing Contract',32) 

당신이 열 정적 인 것을 알고 있다면. 그럼 당신은이 작업을 수행 할 수 있습니다

먼저 고유 열 이름 : 동적 피벗과 같은 그런

DECLARE @cols VARCHAR(MAX), 
     @colsWithIsNull VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_Number() OVER(PARTITION BY tbl.Action ORDER BY tbl.Action) AS iRank, 
     tbl.Action 
    FROM 
     #tbl AS tbl 
) 
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(Action), 
        QUOTENAME(Action)), 
     @colsWithIsNull=COALESCE(@colsWithIsNull + ',ISNULL('+QUOTENAME(Action)+',0) AS '+QUOTENAME(Action), 
        'ISNULL('+QUOTENAME(Action)+',0) AS '+QUOTENAME(Action)) 
FROM 
    CTE 
WHERE 
    iRank=1 

:

SELECT 
    AccountManager, 
    ISNULL([Client Negotiation],0) AS [Client Negotiation], 
    ISNULL([Closing],0) AS [Closing], 
    ISNULL([Email],0) AS [Email], 
    ISNULL([Preparing Contract],0) AS [Preparing Contract] 
FROM 
(
SELECT 
    tbl.AccountManager, 
    tbl.Action, 
    tbl.Count 
FROM 
    #tbl AS tbl 
) AS p 
PIVOT 
(
    SUM([Count]) 
    FOR [Action] IN([Client Negotiation],[Closing],[Email],[Preparing Contract]) 
) AS pvt 

그렇지 않으면이 같은 동적 피벗을 할 필요가

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    AccountManager, 
    '[email protected]+' 
FROM 
(
SELECT 
    tbl.AccountManager, 
    tbl.Action, 
    tbl.Count 
FROM 
    #tbl AS tbl 
) AS p 
PIVOT 
(
    SUM([Count]) 
    FOR [Action] IN('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 

내 경우에는 임시 테이블을 삭제합니다.

DROP TABLE #tbl 
+0

행의 동적 데이터에 대한 탁월한 해답! – AshesToAshes

+0

감사합니다. 도와 줘서 기뻐요 :-) – Arion