从unpivot表中删除筛选器的SQL

从unpivot表中删除筛选器的SQL,sql,sql-server-2008,pivot,pivot-table,unpivot,Sql,Sql Server 2008,Pivot,Pivot Table,Unpivot,我有这个unpivot表,我希望删除应用于它的过滤器 DECLARE @colsPivot AS NVARCHAR(MAX), @colsUnpivot as NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(year(EcoDate)) from PhdRpt.RptCaseEco

我有这个unpivot表,我希望删除应用于它的过滤器

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,比如'Net%'——但我一直收到以下错误:

Msg 8167,16级,状态1,第10行
列“EcoDate”的类型与UNPIVOT列表中指定的其他列的类型冲突。

Msg 207,16级,状态1,第4行
列名“reportruncaseid”无效。

Msg 207,16级,状态1,第4行
列名“Ecodate”无效。

这是桌子的样子

可以删除获取要取消PIVOT的列列表的筛选器,但如果有不想取消PIVOT的列,则需要将其排除:

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
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);

此外,如果有不同数据类型的列,则在应用取消激活之前,必须将它们转换为相同的数据类型。

要取消激活的表的表结构是什么?当您应用unpivot时,数据类型必须相同,因此您可能需要在unpivot之前应用强制转换,但您需要提供更多详细信息。我正在旋转EcoDate并动态取消对其余列的强制转换。我们不会事先知道栏目的数量或生态日期的数量。你将如何铸造未知数量的栏目?@RolandP你在这里说的是多少栏目?100? 您可能需要查看其他方法来使用强制转换创建sql字符串,包括游标。它可能是100。这实际上取决于最终用户。这些表可以随意更改,这就是为什么我需要它是动态的。@RolandP,这样用户就可以更改表上的数据类型了?表上的当前数据类型是什么?你能用
rptcaseeco
的创建表编辑你的OP吗?他们可以从我们的程序中添加新的列。