从unpivot表中删除筛选器的SQL
我有这个unpivot表,我希望删除应用于它的过滤器从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
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吗?他们可以从我们的程序中添加新的列。