2

嗨,我有下表:

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  
4

1 回答 1

1

您可以使用动态数据透视表和动态查询中的联接来执行此操作#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 ('+@FieldList+')
  ) as P
inner join #tProduct as TP
  on P.ProductID = TP.tProductID'

exec(@SQL)

SQL小提琴

于 2013-01-15T06:54:28.207 回答