Sql server 在构造的字符串查询动态中使用UNPIVOT

Sql server 在构造的字符串查询动态中使用UNPIVOT,sql-server,dynamic,unpivot,Sql Server,Dynamic,Unpivot,我正在构建一个查询,其中需要对动态列执行UNPIVOT操作。(abcd是字符串名称的示例) 不这样做: data1 data2 Name Website random 1 2 a com sq 1 2 d fr sq 3 4 b com fd 3 4 a fr fd 这里的问题是为了构建我的第一个表,我使用动态SQL(@QueryFinal),因为这个列。

我正在构建一个查询,其中需要对动态列执行UNPIVOT操作。(abcd是字符串名称的示例)

不这样做:

data1 data2 Name Website random
  1     2    a     com     sq
  1     2    d     fr      sq
  3     4    b     com     fd
  3     4    a      fr     fd
这里的问题是为了构建我的第一个表,我使用动态SQL(@QueryFinal),因为这个列。 这是我的UNPIVOT动态查询

'SELECT data1, data2, Name, Website
FROM '+@QueryFinal+'
UNPIVOT (
         Name FOR Website in ('+@WebsiteCol+')
         ) f;'
在我的@QueryFinal中,我有一个WHERE。。。。按顺序,似乎UNPIVOT无法处理。 当我删除WHERE和ORDER BY子句时,会出现以下错误:

Incorrect syntax near the keyword 'UNPIVOT'.

尝试以下动态轴心:

--drop table if exists unpivottest
create table unpivotTest (data1 int, data2 int, com char(1), fr char(1))

insert into unpivotTest 
select 1, 2, 'a' , 'd' union all
select 3, 4, 'b', 'a' 

select * from unpivotTest

declare @colsunpivot as nvarchar(max),
   @query  as nvarchar(max)

select @colsunpivot = stuff((select ','+ quotename(c.name)
                             from sys.columns c
                             where c.object_id = object_id('dbo.unpivottest') and c.name not like '%data%'
                             for xml path('')), 1, 1, '')

set @query 
          = 'select data1, data2, name, website
             from unpivottest
             -- you cannot do the ordering here
             unpivot
             (
                name
                for website in ('+ @colsunpivot +')
             ) u
            where data1 = 1 -- here you can use your where clause
            order by data1' -- here you can do the ordering by any col
--print @query
exec sp_executesql @query;

检查工作演示

即使它的列名与示例中的列名不同,也会生成最终查询,感谢您的帮助。我把WHERE子句放在第一个SELECT中,把orderby放在UNPIVOT中

DECLARE @QueryFinal VARCHAR(max) = @Query + @QueryBis  + '
from #CALENDAR_FINAL temp
LEFT JOIN #BURSTS b on b.bur_id = temp.bur_id
LEFT JOIN digital_calendar_status dcs ON dcs.dcs_date = temp.[Date] AND dcs.dif_id = '+convert(varchar(2),@FormatId)+'
LEFT JOIN digital_calendar_event dce ON dce.dce_date = temp.[Date]
WHERE '+@ConditionConflict+@ConditionIcon+@ConditionDate

DECLARE @Pivot VARCHAR(2000)='
SELECT 
DateStr, f.Conflict, f.dcs_id, f.Status, f.Website, f.Advertiser,  f.Comment, f.EventName, f.EventIcone
FROM ('+@QueryFinal+') AS a
UNPIVOT
(
Advertiser
FOR Website IN ('+@WebsiteCol+')
) f
ORDER BY Date;
'

PRINT
是你的朋友。查看
PRINT@YourDynamicSQLVariable的输出
并尝试调试它;如果您在发布问题中的输出时遇到问题,“@colsunpoivot”代表我的第一个表的所有列?因为除了“com”和“fr”之外,我还有其他我不想取消PIVOT的列,所以我的“@colsunpoivot”代表我想取消PIVOT的所有网站列。不是所有这些列,除了名称中包含
数据的列。注意,条件
和c.name与
stuff
函数中的“%data%”不同。也就是说,在取消枢轴时,我们只考虑
com
&
fr
cols。如果你有更多这样的专栏,比如美国,等等,他们也会被动态收录。我明白了,但我看不出和我所做的有什么不同。。。“unpivottest”查询具有WHERE和ORDER BY子句。我的“@WebsiteCol”表示我要取消打印的所有列@WebsiteCol'=fr,com,ru,de您应该发布查询的完整脚本。也许我们可以通过查看所有这些来发现问题。我认为您在错误的地方进行订购。可以在取消激活结果集后对其进行排序。我会更新答案。
DECLARE @QueryFinal VARCHAR(max) = @Query + @QueryBis  + '
from #CALENDAR_FINAL temp
LEFT JOIN #BURSTS b on b.bur_id = temp.bur_id
LEFT JOIN digital_calendar_status dcs ON dcs.dcs_date = temp.[Date] AND dcs.dif_id = '+convert(varchar(2),@FormatId)+'
LEFT JOIN digital_calendar_event dce ON dce.dce_date = temp.[Date]
WHERE '+@ConditionConflict+@ConditionIcon+@ConditionDate

DECLARE @Pivot VARCHAR(2000)='
SELECT 
DateStr, f.Conflict, f.dcs_id, f.Status, f.Website, f.Advertiser,  f.Comment, f.EventName, f.EventIcone
FROM ('+@QueryFinal+') AS a
UNPIVOT
(
Advertiser
FOR Website IN ('+@WebsiteCol+')
) f
ORDER BY Date;
'