SQL2000行转列于列转行问题,急~~~ (部门是不确定几个的)

有没有人在啊,想请教下,SQL2000行转列于列转行问题,急~~~ (部门是不确定几个的)
最新回答
天边シ深海

2024-11-25 16:33:11

静态脚本:
select '当月入职人数' as 项目
, case when 部门='行政部' then 当月入职人数 else null end as 行政部
, case when 部门='技术部' then 当月入职人数 else null end as 技术部
from 表名
union all
select '当月离职人数' as 项目
, case when 部门='行政部' then 当月离职人数 else null end as 行政部
, case when 部门='技术部' then 当月离职人数 else null end as 技术部
from 表名
union all
select '当月在职人数' as 项目
, case when 部门='行政部' then 当月在职人数 else null end as 行政部
, case when 部门='技术部' then 当月在职人数 else null end as 技术部
from 表名

改动态脚本(只改部门,即改原表行不定,列数目固定):
declare @sql nvarchar(4000)
set @sql=''
set @sql=@sql+'
select ''当月入职人数'' as 项目
'
select @sql=@sql+', case when 部门='''+部门+''' then 当月入职人数 else null end as '+部门
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''当月离职人数'' as 项目
'
select @sql=@sql+', case when 部门='''+部门+''' then 当月离职人数 else null end as '+部门
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''当月在职人数'' as 项目
'
select @sql=@sql+', case when 部门='''+部门+''' then 当月在职人数 else null end as '+部门
from 表名
set @sql=@sql+'
from 表名
'
exec sp_executesql @sql

改动态脚本(改原表行和列数目不固定,两层动态脚本,能实现但基本难读):
declare @sql nvarchar(4000)
set @sql='declare @sql_in nvarchar(4000)
set @sql_in='' '' '
set @sql=@sql+'select @sql_in=@sql_in+''union all
select ''''''+name+'''''' as 项目
'
select @sql=@sql+', case when 部门='''''+部门+''''' then ''+name+'' else null end as '+部门
from 表名
set @sql=@sql+'
from 表名
''
from syscolumns where id=(select id from sysobjects where name=''表名'')
order by colorder
set @sql_in=stuff(@sql_in,1,10,'''')
exec sp_executesql @sql_in
'
exec sp_executesql @sql

由于是sql2000,nvarchar类型只能最多4000个字,如果你部门太多,动态脚本长度肯定是不行的
与审美无关△

2024-11-25 15:28:57

你看下边的例子:
use test
go
if object_id('test.dbo.tb') is not null drop table tb
-- 创建数据表
create table tb
(
EmpNo varchar(2),
MotionNo varchar(6),
RecNo char(7),
Qty1 int,
Qty2 int
)
go
--插入测试数据
insert into tb select 'A','00000','Rec001',11,88
union all select 'A','00001','Rec001',20,55
union all select 'B','00000','Rec001',8,66
union all select 'C','00000','Rec001',10,23
union all select 'C','00001','Rec001',15,120
union all select 'A','00000','Rec002',16,231
union all select 'A','00001','Rec002',22,112
union all select 'B','00001','Rec002',30,121
union all select 'C','00003','Rec003',32,55
go
--代码实现

declare @sql nvarchar(max)
select @sql=isnull(@sql+',','')+'Qty'+ltrim(num)+'1=max(case when RecNo='''+rtrim(RecNo)+''' then rtrim(Qty1) end)'
+',Qty'+ltrim(num)+'2=max(case when RecNo='''+rtrim(RecNo)+''' then rtrim(Qty2) end)'
+',RecNo'+ltrim(num)+'=max(case when RecNo='''+rtrim(RecNo)+''' then RecNo end)'
from (select distinct RecNo,num=row_number()over(order by getdate()) from tb group by RecNo)t
exec('select EmpNo,MotionNo,'+@sql+' from tb group by EmpNo,MotionNo order by EmpNo')

/*测试结果

EmpNo MotionNo Qty11 Qty12 RecNo1 Qty21 Qty22 RecNo2 Qty31 Qty32 RecNo3
---------------------------------------------------------------------------------
A 00000 11 88 Rec001 16 231 Rec002 NULL NULL NULL
A 00001 20 55 Rec001 22 112 Rec002 NULL NULL NULL
B 00000 8 66 Rec001 NULL NULL NULL NULL NULL NULL
B 00001 NULL NULL NULL 30 121 Rec002 NULL NULL NULL
C 00000 10 23 Rec001 NULL NULL NULL NULL NULL NULL
C 00001 15 120 Rec001 NULL NULL NULL NULL NULL NULL
C 00003 NULL NULL NULL NULL NULL NULL 32 55 Rec003

(7 行受影响)
*/
追问
你这是行转列...   我现在需要的是行转列,列转成行... 
还有一点我需要的是2000的语法...
追答
例如:如题:例如我有一个表tb_A(编号,姓名,学科,分数)
记录如下:
001 小李 数学 100
001 小李 语文 88
001 小李 英语 99
002 小张 数学 60
002 小张 语文 60
002 小张 英语 60
按照你的方法显示的结果是:
字段名: 编号 姓名 数学 语文 英语 数学 语文 英语
001 小李 100 88 99 100 88 99
001 小张 60 60 60 60 60 60
我想要的现实结果是:
字段名: 编号 姓名 数学 语文 英语
001 小李 100 88 99
001 小张 60 60 60
怎样实现?

解决:

IF NOT OBJECT_ID('成绩表') IS NULL
DROP TABLE 成绩表
GO

CREATE TABLE [成绩表] (
[编号] NVARCHAR(10),
[姓名] NVARCHAR(10),
[学科] NVARCHAR(10),
[分数] INT)
GO

INSERT INTO [成绩表]
SELECT N'001',N'小李',N'数学',100 UNION
SELECT N'001',N'小李',N'语文',88 UNION
SELECT N'001',N'小李',N'英语',99 UNION
SELECT N'002',N'小张',N'数学',60 UNION
SELECT N'002',N'小张',N'语文',60 UNION
SELECT N'002',N'小张',N'英语',60

DECLARE @Sql NVARCHAR(4000)
SET @Sql = ''
SELECT @Sql = @Sql + ',' + QUOTENAME([学科]) + '=MAX(CASE WHEN [学科]=' + QUOTENAME([学科], '''') + ' THEN [分数] ELSE 0 END)'
FROM 成绩表
GROUP BY [学科]

EXEC ('SELECT [编号], [姓名]' + @SQL + ' FROM [成绩表] GROUP BY [编号], [姓名]')
真相是真

2024-11-25 21:02:35

我是把数据都取出来 然后new一个DataTable 用部门做列名 然后把对应部门的值放到每一个单元格中
忆海

2024-11-25 11:33:43

step1,行转列
项目 部门1 部门2 部门3 。。。。
proj1 1 2 3
step2,
3个union all (3列的情况 )
列数也动态 那就再来一次动态拼 利用 syscolumns表