日期:2014-05-19  浏览次数:20432 次

一个动态列转行问题,请高手指教!!!
表t_errect结构如下:    
P_name     m1     m2     m3
pc1           3       5       8
pc2           6       9       12
要求不使用select   ...   from   ..
                    union
                    select   ...   from   ..
                    ......
要得到:
P_name   monthly   m_value
pc1             m1                 3
pc1             m1                 5
pc1             m1                 8
pc2             m2                 6
pc2             m2                 9
pc2             m2                 12

declare   @m_str   varchar(50),@monthly   int,@sql   varchar(200)
set   @monthly=1
whlie   (@monthly <4)
begin
      set   @m_str= 'm '+cast(@monthly   as   varchar(5))
      set   @sql= 'select   P_name, ' ' ' '+@monthly+ ' ' ' '   as   monthly, '+@m_str+ '   as   m_value   from '
              + '(select   P_name, '+@m_str+ '   as   m_value   from   t_errect)   a '
      exec(@sql)
      set   @monthly=@monthly+1
end
这样做得出的结果分别有3个select结果,如何将这些结果都集中在一个select中显示出来?

------解决方案--------------------
Create Table t_errect
(P_name Varchar(10),
m1 Int,
m2 Int,
m3 Int)
Insert t_errect Select 'pc1 ', 3, 5, 8
Union All Select 'pc2 ', 6, 9, 12
GO
declare @m_str varchar(50),@monthly int,@sql varchar(2000)
select @monthly=1, @sql = ' '
while (@monthly <4)
begin
set @m_str= 'm '+cast(@monthly as varchar(5))
set @sql= @sql + ' union all select P_name, ' ' '+ @m_str+ ' ' ' as monthly, '+@m_str+ ' as m_value from t_errect '
set @monthly=@monthly+1
end
select @sql = Stuff(@sql, 1, 10, ' ')
exec(@sql)
GO
Drop Table t_errect
--Result
/*
P_name monthly m_value
pc1 m1 3
pc2 m1 6
pc1 m2 5
pc2 m2 9
pc1 m3 8
pc2 m3 12
*/