2013-10-31 38 views
1

我在使用數據透視表或動態表時遇到問題。數據透視表問題:原始表或枚舉中沒有標識

我發現這個例子對理解我如何完成這個任務非常有幫助;但是,我缺少內部標識符列。

Dynamic Pivot Columns in SQL Server

這裏有提供在後上方的SQL小提琴:http://www.sqlfiddle.com/#!3/7fad2/6

你可以看到,在第二個表propertyObjects,則每個的objectID計數1,2,3,4 。我沒有這個財產ID計數。這是我的所有

case category 
1  xx 
1  xyx 
1  abc 
2  ghj 
2  asdf 
3  dfgh 

正如你可以看到我有許多不同類別的每一種情況下,卻沒有類標識符字段。

這就是我需要:

case cat1 cat2 cat3 
1  xx xyx abc 
2  ghj asdf 
3  dfgh 

所以我想我可能需要每箱列添加到源表,並以某種方式枚舉類。這將使我可以在所提供的示例中使用樞軸。思考?

我試圖使用row_number來實現這一點,但它並不停止在每個案例編號,它只是繼續計算整個表。

+0

對不起,格式化失敗 – riverdog

回答

1

由於每個case都有多個值,因此您需要使用row_number()來獲取每個類別的單獨列。

在您編寫動態SQL版本之前,我會先寫一個硬編碼版本。代碼將類似於:

SELECT [case], cat1, cat2, cat3 
FROM 
(
    SELECT [case], category, 
     'cat'+ 
     cast(row_number() over(partition by [case] 
           order by category) as varchar(10)) seq 
    FROM yourTable 
) x 
PIVOT 
(
    max(category) 
    for seq in (cat1, cat2, cat3) 
)p; 

請參閱SQL Fiddle with Demo

現在你有邏輯下去,那麼你可以將其轉換爲動態SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('cat'+cast(seq as varchar(10))) 
        from 
        (
         select row_number() over(partition by [case] 
               order by category) seq 
         from yourtable 
        ) d 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [case],' + @cols + ' 
      from 
      (
       SELECT [case], category, 
       ''cat''+ 
        cast(row_number() over(partition by [case] 
             order by category) as varchar(10)) seq 
       FROM yourTable 
      ) x 
      pivot 
      (
       max(category) 
       for seq in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo。這會給你結果:

| CASE | CAT1 | CAT2 | CAT3 | 
|------|------|--------|--------| 
| 1 | abc |  xx | xyx | 
| 2 | asdf | ghj | (null) | 
| 3 | dfgh | (null) | (null) | 
+0

快速的廢話!謝謝,先生! – riverdog

+0

如果我想添加一列或更多列,該怎麼辦?我編輯模式以添加n個額外的狀態字段,因此最終結果如下所示: case | cat1 | status1 | cat2 | status2等等。我不確定如何將這添加到QUOTENAME和下面的查詢中。 – riverdog

+1

@JoshuaRivers我的建議是用新的要求發佈一個新問題。 – Taryn