0

このアンピボット テーブルがあり、適用されているフィルターを削除したいと考えています。

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



select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(year(EcoDate)) 
                    from PhdRpt.RptCaseEco
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('PhdRpt.RptCaseEco') 
         and C.name Like 'Net%'
         for xml path('')), 1, 1, '')


set @query 
  = 'select *
      from
      (
        select reportruncaseid, year(Ecodate) as EcoYear, val, col
        from phdrpt.rptcaseeco

        unpivot
        (
          val
          for col in ('+ @colsUnpivot +')
        ) u
      ) x1
      pivot
      (
        max(val)
        for ecoyear in ('+ @colspivot +')

      ) p ORDER BY reportruncaseid'


exec(@query)

以前は、すべての列に「Net」というプレフィックスが付いていたため、このテーブルは機能していましたが、「Net」で始まらないために除外されている他の列があります。--- および C.name Like 'Net%' --- を削除しようとしましたが、次のエラーが発生し続けます。

Msg 8167, Level 16, State 1, Line 10 The type of column "EcoDate" conflicts with the type of other columns specified in the UNPIVOT list.
Msg 207, Level 16, State 1, Line 4 Invalid column name 'reportruncaseid'.
Msg 207, Level 16, State 1, Line 4 Invalid column name 'Ecodate'.

テーブルはこんな感じ
テーブル

4

1 に答える 1

2

UNPIVOT する列のリストを取得するためのフィルターは削除できますが、UNPIVOT したくない列がある場合は、それらを除外する必要があります。

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('PhdRpt.RptCaseEco') 
         and C.name not in ('reportruncaseid', 'Ecodate')
         for xml path('')), 1, 1, '')

reportruncaseidこれにより、 and Ecodate(またはピボットを解除したくない他の列)を除いて、すべての列がピボット解除に戻ります 。したがって、完全なクエリは次のようになります。

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

select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(year(EcoDate)) 
                    from PhdRpt.RptCaseEco
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('PhdRpt.RptCaseEco') 
         and C.name not in ('reportruncaseid', 'Ecodate')
         for xml path('')), 1, 1, '')

set @query 
  = 'select *
      from
      (
        select reportruncaseid, year(Ecodate) as EcoYear, val, col
        from phdrpt.rptcaseeco

        unpivot
        (
          val
          for col in ('+ @colsUnpivot +')
        ) u
      ) x1
      pivot
      (
        max(val)
        for ecoyear in ('+ @colspivot +')

      ) p ORDER BY reportruncaseid'

exec(@query);

また、データ型が異なる列がある場合は、アンピボットを適用する前にそれらを同じデータ型にキャストする必要があります。

于 2013-04-29T16:29:10.007 に答える