2014-02-17 4 views
3

Если у меня есть таблица команд с неизвестным количеством членов, есть ли способ сделать динамический криволинейный запрос?Можно ли использовать сводную таблицу с неизвестным количеством столбцов?

create table #t (
    team varchar (20), member varchar (20) 
) 
insert into #t values ('ERP', 'Jack') 
insert into #t values ('ERP', 'John') 
insert into #t values ('ERP', 'Mary') 
insert into #t values ('ERP', 'Tim') 
insert into #t values ('CRM', 'Robert') 
insert into #t values ('CRM', 'Diana') 

select * from #t 

select team, [1] as teamMember1, /* 1st select */ 
    [2] as teamMember2, [3] as teamMember3 
from 
(select team , member, row_number() /* 3rd select */ 
    over (partition by team order by team) as rownum 
from #t) a 
pivot (max(member) for rownum in ([1], [2], [3])) as pvt 

drop table #t 
+3

Я думаю, что вы ищете это: http://stackoverflow.com/questions/2922797/t-sql-pivot-possibility-of-creating -Таблица-колонки-из-строки значений. Пример Ицика Бен-Гана о том, как построить динамический PIVOT. –

ответ

0

Почему да, да. Вот сценарий, который я приготовил много лет назад для аналогичной проблемы, которая была в конечном итоге решена путем предоставления пользователю Excel и стирания его рук. Я извиняюсь, что он не настроен с вашими данными примера, но, надеюсь, легко следовать.

Надежда, что помогает,

Джон

--------------START QUERY-------------- 
-- Example Table 
CREATE TABLE #glbTestTable 
(
    ProviderID INT, 
    Total  INT, 
    PaymentDate SMALLDATETIME 
) 

--So the dates insert properly 
SET DATEFORMAT dmy 

-- Populate Example Table 
INSERT INTO #glbTestTable VALUES (232, 12200, '12/01/09') 
INSERT INTO #glbTestTable VALUES (456, 10200, '12/01/09') 
INSERT INTO #glbTestTable VALUES (563, 11899, '02/03/09') 
INSERT INTO #glbTestTable VALUES (221, 5239, '13/04/09') 
INSERT INTO #glbTestTable VALUES (987, 7899, '02/03/09') 
INSERT INTO #glbTestTable VALUES (1, 1234, '02/08/09') 
INSERT INTO #glbTestTable VALUES (2, 4321, '02/07/09') 
INSERT INTO #glbTestTable VALUES (3, 5555, '02/06/09') 

-- Raw Output 
SELECT * 
FROM #glbTestTable 

-- Build Query for Pivot -- 
DECLARE @pvtColumns VARCHAR(MAX) 
SET @pvtColumns = '' 

-- Grab up to the first 1023 "Columns" that we want to use in Pivot Table. 
-- Tables can only have 1024 columns at a maximum 
SELECT TOP 1023 @pvtColumns = @pvtColumns + '[' + CONVERT(VARCHAR, PaymentDate, 103) + '], ' 
FROM (SELECT DISTINCT PaymentDate FROM #glbTestTable) t_distFP 

-- Create PivotTable Query 
DECLARE @myQuery VARCHAR(MAX) 
SET @myQuery = ' 
SELECT ProviderID, ' + LEFT(@pvtColumns, LEN(@pvtColumns) - 1) + ' 
FROM (SELECT ProviderID, PaymentDate, Total 
    FROM #glbTestTable) AS SourceTable 
PIVOT 
(
    SUM(Total) 
    FOR PaymentDate IN (' + LEFT(@pvtColumns, LEN(@pvtColumns) - 1) + ') 
) AS PivotTable' 

-- Run the Pivot Query 
EXEC(@myQuery) 

-- Cleanup 
DROP TABLE #glbTestTable 
---------------END QUERY--------------- 
Смежные вопросы