2016-07-14 34 views
0

我知道有更好的方法來設計的表,但是這僅僅是我所需要的一個例子自參照動態SQL查詢支點返回不需要的結果

我似乎無法讓我期待的結果對於

表和數據:

enter image description here

查詢:

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

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(columnType) 
      FROM [Values] 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @query = 'SELECT ' + @cols + ' FROM 
     (
      SELECT value, columnType 
      FROM [Values] 
     ) x 
     PIVOT 
     (
      MAX(value) 
      FOR columnType IN (' + @cols + ') 
     ) p ' 

EXECUTE(@query) 

結果我得到:

enter image description here

結果我想

Product Item SubItem 

    A  A A  A A A 
    A  A B  A A B 
    B  B A  NULL 

回答

0

你的查詢可以使用join s內輕鬆解決了兩個層次:

select v.value as Product, vi.value as Item, vsi.value as Subitem 
from [Values] v left join 
    [Values] vi 
    on vi.column_type = 'Item' and vi.parent_id = v.id left join 
    [Values] vsi 
    on vsi.column_type = 'Sub Item' and vsi.parent_id = v.id 
where v.column_type = 'Product'; 

如果你有一個未知級別數量,那麼您可以使用動態SQL擴展此查詢。

+0

這不完全是我正在尋找的答案,但它會工作。編碼動態sql有點麻煩 – Anarchy101