2015-06-19 28 views
0

我需要動態表#table從這個格式轉換數據:SQL服務器 - 動態透視變換數據

 
spot_id  name  pct 
-------  ----  --- 
1    A   2 
1    B   8 
1    C   6 
2    A   4 
2    B   5 
3    A   5 
3    D   1 
3    E   4 

到:

 
spot_id  A  B  C  D  E 
------- --- --- --- --- --- 
1   2  5  6  0  0 
2   4  5  0  0  0 
3   5  0  0  1  4 

的事情是,我不知道提前什麼列「名稱」的值是多少或他們有多少,所以我認爲我必須使用某種動態SQL主控


只是想出瞭如何解決這個問題:

 

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(name) 
        from (SELECT DISTINCT name FROM #table) T 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = N'SELECT spot_id,' + @cols + N' from 
      (
       select spot_id, name, pct 
       from #table 
      ) as x 
      pivot 
      (
       max(pct) 
       for name in (' + @cols + N') 
      ) as p ' 

exec sp_executesql @query; 

如果有更優雅的方式做同樣的?

回答

0
declare @t table (Spot int,name varchar(1),pct int) 
insert into @t(Spot,name,pct)values(1,'A',2),(1,'B',8),(1,'C',6),(2,'A',4),(2,'B',5),(3,'A',5),(3,'D',1),(3,'E',4) 


select Spot,ISNULL([A],0)[A],ISNULL([B],0)[B],ISNULL([C],0)[C],ISNULL([D],0)[D],ISNULL([E],0)[E] from (Select Spot,PCT,Name from @t)T 
PIVOT(MAX(PCT) FOR Name IN ([A],[B],[C],[D],[E]))P 


select Spot,ISNULL(MAX(CASE WHEN name = 'A' THEN pct END),0)A,ISNULL(MAX(CASE WHEN name = 'B' THEN pct END),0)B , 
ISNULL(MAX(CASE WHEN name = 'C' THEN pct END),0)C , 
ISNULL(MAX(CASE WHEN name = 'D' THEN pct END),0)D ,ISNULL(MAX(CASE WHEN name = 'E' THEN pct END),0)E from @t 
GROUP BY Spot 

使用動態查詢:

if object_id('tempdb..#t') is not null 
    drop table #t 

CREATE table #t(Spot int,name varchar(1),pct int) 
insert into #t(Spot,name,pct)values(1,'A',2),(1,'B',8),(1,'C',6),(2,'A',4),(2,'B',5),(3,'A',5),(3,'D',1),(3,'E',4) 

DECLARE @statement NVARCHAR(max) 
,@columns NVARCHAR(max) 

SELECT @columns = ISNULL(@columns + ', ', '') + N'[' + tbl.name + ']' 
FROM (
    SELECT DISTINCT name 
    FROM #t 
    ) AS tbl 

SELECT @statement = ' select Spot,ISNULL([A],0)[A],ISNULL([B],0)[B],ISNULL([C],0)[C],ISNULL([D],0)[D],ISNULL([E],0)[E] from (Select Spot,PCT,Name from #t)T 
PIVOT(MAX(PCT) FOR Name IN (' + @columns + ')) as pvt' 

EXEC sp_executesql @statement = @statement 
+0

謝謝,但它並不能幫助我很多,因爲就像我寫的 「名稱」 列的值(A,B,C,d)是動態我不知道他們是什麼。它必須在某種程度上是動態的 – user2822455

+0

仍然無法幫到我..「名稱」列的值是動態的..我只是想出了答案。我會在我的問題 – user2822455

+0

中發佈它,請參閱動態查詢@ user2822455 – mohan111