2012-10-29 39 views
0

我有一個SQL表是這樣的:sql查詢特定格式選擇記錄(使用旋轉或其他)

Animal1  Animal2  Corelation 
---------+---------------+-------------- 
Cat    Cat   1  
Cat    Dog   0.6  
Cat    Mouse   0.8  
Dog    Cat   0.6 
Dog    Dog   1  
Dog    Mouse   0.4  
Mouse   Cat   0.8  
Mouse   Dog   0.4  
Mouse   Mouse   1 

我正在尋找一個SQL查詢返回的結果如下:

Animal 1  Cat    Dog    Mouse 
---------+---------------+------------------+---------------+ 
Cat   1     0.6    0.8 
Dog   6     1     0.4 
Mouse   0.8    0.4    1 

基本上我想要更可讀的版本的表。

我試圖用樞這樣的:

use SymbolsDB 
select * from [AnimalsTable] 
pivot (
    [Corelation] 
    for [Animal2] in (select * from [Animal2] 
) 

但它無法正常工作。我不確定我是否瞭解數據透視表是如何工作的,以及它是否可以用於我的案例。還是有另一種方法來做到這一點? (我試圖避免環路,因爲我有1分萬人次的紀錄)

感謝

+0

你期待返回全部100萬條記錄的結果集? (你會有1000列) – dana

回答

2

你不能把一個SELECT聲明PIVOT內返回值的列表,然後必須是恆定的。如果你正在尋找一個動態PIVOT,那麼你將需要使用這樣的事情:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Animal2) 
        from animals 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Animal1, ' + @cols + ' from 
      (
       select animal1, animal2, Corelation 
       from animals 
      ) x 
      pivot 
      (
       min(Corelation) 
       for animal2 in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with demo

+0

謝謝先生。它工作 – Youssef

+0

@Youssef高興地幫助,很高興你得到它的工作。 – Taryn

0

在一個支點上,列名必須是恆定的

所以要做到這一點,您需要使用動態SQL。

declare @options varchar(max) = '' 
select @options = @options + ', [' + animal2 + ']' from (select distinct animal2 from animals) v 
select @options = substring(@options ,2, LEN(@options)) 

declare @sql nvarchar(4000) = 
    'select * from [AnimalsTable] pivot (max([Corelation]) 
    for [Animal2] in (' + @options + ')) p' 

    exec sp_executesql @sql