2012-03-03 2 views
0

Еще один для вас SQL гуру сервера ...своп Некоторые строки в столбцы в SQL Server 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) 

Если вы знаете, что столбцы являются статическими. Тогда вы можете сделать это:

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 @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 

Тогда динамическая ось, как это:

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