日期:2014-05-18  浏览次数:20330 次

简单行转列问题
我已经通过存储过程取得了报表的数据,格式如下:
工厂                 月份1             月份2     ...   到月份N       //月份是根据客户查询条件的
工厂1             销售额           销售额           销售额
工厂2             销售额           销售额           销售额
.
.
.
工厂N   ...
表示一个大工厂下面有多个小工厂,   通过条件查各个工厂某几个月的销售额
数据已经取出来了,但是要显示成下面格式:
月份                   工厂1               工厂2             ...   工厂N
月份1               销售额             销售额             ...
月份2               销售额             销售额    
...
月份N         ...
怎么写

------解决方案--------------------
行列转换实例:

--創建測試環境
Create Table TEST
(SPBM Nvarchar(20),
YGTJS Int,
SJTJS Int,
BFL Nvarchar(20))
--插入數據
Insert TEST Select N '技術部 ', 75, 51, '68% '
Union All Select N '資材部 ', 29, 29, '100% '
Union All Select N '生產部 ', 1069, 821, '77% '
GO
--測試
Declare @SPJS Varchar(8000), @SPBM Varchar(8000)
Select @SPJS = ' ', @SPBM = ' '
Select @SPJS = @SPJS + ' Union All Select SPBM, ' + Cast(ColID As Varchar) + ' As ColID, ' ' ' + Name + ' ' ' As SPJS, Cast( ' + Name + ' As Varchar) As [ALLSPJS] From TEST '
From SysColumns Where ID = OBJECT_ID( 'TEST ') And Name != 'SPBM ' Order By ColID
Select @SPJS = Stuff(@SPJS, 1, 10, ' ')
Select @SPBM = @SPBM + ', Max(Case SPBM When ' ' ' + SPBM + ' ' ' Then ALLSPJS Else ' ' ' ' End) As ' + SPBM From TEST Group By SPBM
Print @SPJS
Print @SPBM
EXEC( ' Select SPJS ' + @SPBM + ' From ( ' + @SPJS + ' ) A Group By SPJS Order By Min(ColID) ')
GO
--刪除測試環境
Drop Table TEST
------解决方案--------------------
统计工厂数,
建一临时表保存结果,以列数为工厂数
行数为1-12之间(随楼主所需)
再根据已知数的数据,对此表进行update

------解决方案--------------------
--此为将表旋转90度.
--以下三例均可满足楼主的要求.

将下表数据:
A b c d e
-------------------- ----------- ----------- ----------- -----------
x 1 2 3 4
y 5 6 7 8
z 9 10 11 12

转化成如下结果:
a x y z
-------------------- ---------- ---------- ----------
b 1 5 9
c 2 6 10
d 3 7 11
e 4 8 12

--生成测试数据
create table test1(A varchar(20),b int,c int,d int,e int)
insert into test1 select 'x ',1,2 ,3 ,4
insert into test1 select 'y ',5,6 ,7 ,8
insert into test1 select 'z ',9,10,11,12


--生成中间数据表
declare @s varchar(8000)