1

重複の可能性:
貧乏人の SQL ピボット。質問を列として表示し、ユーザーごとの回答を 1 行に表示します

次のクエリを使用して、最初に外部キーごとに 12 レコード (レコードが欠落している場合は null 値) を取得し、次に外部キーごとに 12 レコードすべてを列に変換します。ただし、以下のコードは 12 行を生成しますが、すべての行を列に変換できません。代わりに、外部キー IDS の 1 つだけを変換してから停止します。

これを適切にピボットして、ProductID ごとに行を取得できるようにしてください。前もって感謝します。

  DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

    --BEGIN TRY
           IF EXISTS
                (
                            SELECT *
                            FROM tempdb.dbo.sysobjects
                            WHERE ID = OBJECT_ID(N'tempdb..#ManufacturerAttributes')
                )
                BEGIN
                            DROP TABLE #ManufacturerAttributes
                END
    Create table #ManufacturerAttributes
    ( 
            ProductID uniqueIdentifier,
             PAID uniqueidentifier,
            MfgAttrLabel varchar(50),
            MfgAttrVal varchar(3072),
            MfgAttrUOM varchar(50), 
            rowindex int
    )
    ;With Number
As
(
 Select 1 as rownum union all  Select 2 union all Select 3 union all Select 4 union all Select 5 union all Select 6 union all Select 7 union all Select 8 union all Select 9 union all Select 10 union all Select 11 union all Select 12   
),
ProductDetail 
as 
(
   select P.ProdID, N.rownum from IDWProduct P cross join Number N
)
Insert into #ManufacturerAttributes
Select  ProdID  , PAVAttributeID,PANAme, PAVValue, UOMLabel, P.rownum
 from ProductDetail P
Left join (select Pr.*, row_number() over (partition by PAVProductID order by PAVID) as Rn from IDWProductAttributeValues Pr ) Pr ON rownum = Pr.Rn And PAVProductID = ProdID  
left join IDWUnitofMeasures on Pr.PAVUOM = UOMID 
left join IDWAttributes  A on Pr.PAVAttributeID = A.PAID  AND A.PAIsManufacturerSpecific = 1

 Select * from #ManufacturerAttributes

  select @colsUnpivot = stuff((select ','+quotename(C.name)
         from tempdb.sys.columns as C
         where C.object_id = object_id('tempdb..#ManufacturerAttributes')  
         for xml path('')), 1, 1, '')

-- select @colsUnpivot

 select @colsPivot = STUFF((SELECT  ','  + quotename(c.name   + cast(t.rn as varchar(10)))
                    from
                    (
                      select row_number() over(partition by ProductID   order by ProductID) rn  from #ManufacturerAttributes
                    ) t
                     cross apply 
                      tempdb.sys.columns  as C
                   where C.object_id = object_id('tempdb..#ManufacturerAttributes')   
                   group by c.name, t.rn
                   order by t.rn
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

 --select @colsPivot
   set @query 
  ='select *
      from
      (
        select ProductID, PAID, RowIndex,
            col + cast(rn as varchar(10)) new_col,
            val 
         from 
        (
          select  
          Cast (ProductID as NVarchar(3072)) ProductID
          ,Cast(PAID as NVarchar(3072)) PAID
           ,Cast (MfgAttrLabel  as NVarchar(3072)) MfgAttrLabel
           ,Cast (MfgAttrVal as NVarchar(3072)) MfgAttrVal
           ,Cast (MfgAttrUOM as NVarchar(3072))  MfgAttrUOM  
           ,Cast(rowindex as NVarchar(3072)) rowindex
            ,row_number() over(partition by ProductID order by ProductID) rn
          from  #ManufacturerAttributes

        ) x
        unpivot
        (
          val
          for col in ('+ @colsunpivot +')
        ) u
      ) x1
      pivot
      (
        max(val)
        for new_col in
          ('+ @colspivot +')
      ) p'


    --  Print @query

exec(@query)    

スクリプトで完全な SQLFiddle

4

0 に答える 0