2013-04-02 35 views
0

我也有类似的3-4脚本不同的表作为以前发布的 动态PIVOT多个表Dynamic Pivot (row to columns)如何创建临时表,同时加入的是必须PIVOT

目标: - 创建一个Excel文件,加入所有从枢转表中的字段(均来自每个表中的行)

步骤:

  • (枢轴上不同的表之后)创建为每个单独设置临时表

  • JOIN对列ID的所有临时表从结果

  • 选择列(所有的临时表)

**想知道是否有更好的方法来创建临时表使用一个过程来加入最终选择的所有表。

**我试图创建临时表,但得到的错误:无效的对象

在以前的帖子**

INSERT into #T1 execute('execute' + @query) 
select * from #T1 

**


接受的答案的结果

案例1:枢纽

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

select @colsPivot = STUFF((SELECT ',' 
         + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name) 
        from yourtable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('id', 'instance') 
        group by t.instance, c.name 
        order by t.instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
     from 
     (
     select id, 
      ''Instance''+cast(instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size, 
      Tech 
      from yourtable 
     ) x 
     unpivot 
     (
      value 
      for col in (Name, Size, Tech) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

--exec(@query) 

我试图创建临时表,但得到的错误:无效的对象 在以前的帖子接受的答案的结果

INSERT into #T1 execute('execute' + @query) 
select * from #T1 

案例2:相同的代码PIVOT为MYTABLE

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

select @colsPivot = STUFF((SELECT ',' 
         + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name) 
        from mytable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('id', 'instance') 
        group by t.instance, c.name 
        order by t.instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
     from 
     (
     select id, 
      ''Instance''+cast(instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size, 
      Tech 
      from mytable 
     ) x 
     unpivot 
     (
      value 
      for col in (Name, Size, Tech) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 


    INSERT into #T2 execute('execute' + @query2) 
    select * from #T2 

**案例3:同一代码PIVOT for OurTable **

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

select @colsPivot = STUFF((SELECT ',' 
         + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name) 
        from ourtable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('id', 'instance') 
        group by t.instance, c.name 
        order by t.instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
     from 
     (
     select id, 
      ''Instance''+cast(instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size, 
      Tech 
      from ourtable 
     ) x 
     unpivot 
     (
      value 
      for col in (Name, Size, Tech) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 


    INSERT into #T3 execute('execute' + @query2) 
    select * from #T3 

最终SELECT:你的问题的

select * from #T1 
inner join #T1.id=#T2.id 
inner join #T1.id=#T3.id 
+1

能否请您发表你试过的完整代码?还可以尝试修改上一个问题中解释问题的[** working demo **](http://sqlfiddle.com/#!3/db967/2)。这将非常有帮助。 –

+0

已经定义了“#t1”,“#t2”和“#t3”吗?还是你想创建临时表? – Taryn

+0

不可以,因为它们依赖于来自每个Pivot案例的动态结果集,所以它们不能被定义。我试图将每个Pivot结果保存到它们各自的临时表中。我没有使用表变量。 – Rodricks

回答

2

部分原因是,您使用动态SQL,你想插入到使用临时表以后。以下是与此相关的问题:

  • 临时表无法在之前创建,因为列数未知。
  • 在动态SQL内部创建的临时表将超出以后使用的范围。当你如果你想加入这些多个表创建(以单#开头的)本地临时表

存在这个问题了多名你可以创建一个全局临时表或实际表(不是临时),可以在动态SQL执行期间创建并在该范围之外使用。

OP使用代码我与正在创建一个表改变它:

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

select @colsPivot = STUFF((SELECT ',' 
         + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name) 
        from yourtable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('id', 'instance') 
        group by t.instance, c.name 
        order by t.instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
    into ##t1 -- < create global temp table or real table without the ## 
     from 
     (
     select id, 
      ''Instance''+cast(instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size, 
      Tech 
      from yourtable 
     ) x 
     unpivot 
     (
      value 
      for col in (Name, Size, Tech) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query); 

select * from ##t1 

SQL Fiddle with Demo

这将允许您将多个表连接在一起。

参考:

+0

非常感谢您在这里展示全局临时表的使用。在我看到这个解决方案之前,我刚刚添加了:set @query ='select * into#temp1 ...并在最后添加到stmt'drop table T1;从#temp1选择*到T1;''这实际上创建了一张桌子。但看起来我会打算用实际的表格,因为它们将用于报告目的。再次感谢帮助我解决这个问题。 – Rodricks

+0

@Rodricks是创建一个表而不是临时表可能会更好。真高兴你做到了。 – Taryn

+0

我在另一张桌子上http://sqlfiddle.com/#!3/100bd/5尝试了上述方法,但无法使其工作,我不断收到语法错误。 – Rodricks