2013-01-15 102 views
2

您好我有以下表格:动态SQL Server 2008的查询联接

CREATE TABLE #Test 
     (
     ProductID int, 
     MainMasterFeatureID int, 
     --MasterFeatureValue Varchar(100), 
     ChilFeatureName varchar(100), 
     ParentFeatureName varchar(100) 
    ) 

    INSERT INTO #Test 
    SELECT 40,1,,'Pack','Type' 
    UNION ALL 
    SELECT 40,0,'Laminate','Technology' 
    UNION ALL 
    SELECT 40,11,'Yes','Coated' 
    UNION ALL 
    SELECT 52,1,'Roll','Type' 
    UNION ALL 
    SELECT 52,11,'NO','Coated' 




    SELECT * FROM #Test 


CREATE TABLE #tProduct 
    (
     tProductID int PRIMARY KEY, 
     tProductCode nvarchar(128), 
     tProductName nvarchar(256) 
    ) 
INSERT INTO #tProduct 
SELECT 40,'001','ABC' 
UNION ALL 
SELECT 52,'002','XYZ' 
UNION ALL 
SELECT 50,'006','IJK' 

From #test table我要生成的结果是这样的:

ProductID   Type    Technology  Coated 

    40    Pack    Laminate   YES 

    52    Roll    Null    No 

这里类型,技术,涂层不固定这样可以动态生成...

它可以这样生成...

Declare @sql Varchar(MAX) 
Select @sql = 'SELECT ProductID, ' 
Select @sql = @sql + STUFF((Select DISTINCT ',MAX(Case When ParentFeatureName = ' + CHAR(39) + ParentFeatureName + CHAR(39) + ' Then ChilFeatureName Else ' + CHAR(39) + CHAR(39) + ' End) As ' + ParentFeatureName From #Test For XML PATH('')),1,1,'') 
Select @sql = @sql + ' FROM #Test Group By ProductID' 
Execute(@sql) 

现在我想加入这个充满活力的查询#tProduct来得到想要的结果:

tProductID tProductName  Type    Technology  Coated 

    40   ABC    Pack    Laminate   YES 

    52   XYZ    Roll    Null    No 

回答

0

您可以用动态的支点做到这一点,在动态查询中使用联接到#tProduct

declare @SQL nvarchar(max) 
declare @FieldList nvarchar(max) 

set @FieldList = 
    (
    select distinct ','+quotename(ParentFeatureName) 
    from #Test 
    for xml path(''), type 
).value('substring(text()[1], 2)', 'nvarchar(max)') 

set @SQL = 
' 
select TP.tProductID, 
     TP.tProductName,'+ 
     @FieldList+' 
from 
    (
    select ProductID, 
     ParentFeatureName, 
     ChilFeatureName 
    from #Test 
) as T 
pivot 
    (
    max(T.ChilFeatureName) 
    for T.ParentFeatureName in ('[email protected]+') 
) as P 
inner join #tProduct as TP 
    on P.ProductID = TP.tProductID' 

exec(@SQL) 

SQL Fiddle

+0

感谢mikael..i得到了理想的结果 – SQL006