自引用动态SQL数据透视查询返回不需要的结果

时间:2016-07-14 12:30:52

标签: sql sql-server

我知道有更好的方法来设计表格,但这只是我需要的一个例子

我似乎无法得到我正在寻找的结果

表格和数据:

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

1 个答案:

答案 0 :(得分: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扩展此查询。