部分行转列加数据统计

飞驴 2010-11-19 08:50:27
现有表1
部门 人员类别 项目 借方科目 贷方科目 金额
工厂 管理人员 个人保险 100204 218105 1000
工厂 管理人员 单位保险 310000 400000 2000
....行数不一定

转化成
部门 人员类别 个人保险 借方科目 贷方科目 单位保险 借方科目 贷方科目
工厂 管理人员 1000 100204 218105 2000 310000 400000

如果表1是三行,可能就是
部门 人员类别 个人保险 借方科目 贷方科目 单位保险 借方科目 贷方科目 XX保险 借方科目 贷方科目
工厂 管理人员 1000 100204 218105 2000 310000 400000 1000 00000 11111
...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2010-11-19
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101119/15/a1901e85-9d06-4c54-b1be-78631e19c95a.html

create table tb(部门 varchar(10),人员类别 varchar(10) , 项目 varchar(10) , 借方科目 varchar(10),贷方科目 varchar(10),金额 int)
insert into tb values('工厂', '管理人员','个人保险','100204', '218105', 1000)
insert into tb values('工厂', '管理人员','单位保险','310000', '400000', 2000)
insert into tb values('工厂', '管理人员','公积金','公积金','公积金',0)
go

--sql 2000静态
select 部门 ,
人员类别,
max(case 项目 when '个人保险' then 金额 end) [个人保险],
max(case 项目 when '个人保险' then 借方科目 end) [借方科目],
max(case 项目 when '个人保险' then 贷方科目 end) [贷方科目],
max(case 项目 when '单位保险' then 金额 end) [单位保险],
max(case 项目 when '单位保险' then 借方科目 end) [借方科目],
max(case 项目 when '单位保险' then 贷方科目 end) [贷方科目],
max(case 项目 when '公积金' then 金额 end) [公积金],
max(case 项目 when '公积金' then 借方科目 end) [借方科目],
max(case 项目 when '公积金' then 贷方科目 end) [贷方科目]
from tb
group by 部门 , 人员类别
/*
---------- ---------- ----------- ---------- ---------- ----------- ---------- ---------- ----------- ---------- ----------
工厂 管理人员 1000 100204 218105 2000 310000 400000 0 公积金 公积金

(所影响的行数为 1 行)
*/

--sql 2000动态
declare @sql varchar(8000)
set @sql = 'select 部门 , 人员类别 '
select @sql = @sql + ' , max(case 项目 when ''' + 项目 + ''' then 金额 end) [' + 项目 + ']'
+ ' , max(case 项目 when ''' + 项目 + ''' then 借方科目 end) [借方科目]'
+ ' , max(case 项目 when ''' + 项目 + ''' then 贷方科目 end) [贷方科目]'
from (select distinct 项目 from tb) as a
set @sql = @sql + ' from tb group by 部门 , 人员类别'
exec(@sql)
/*
部门 人员类别 单位保险 借方科目 贷方科目 个人保险 借方科目 贷方科目 公积金 借方科目 贷方科目
---------- ---------- ----------- ---------- ---------- ----------- ---------- ---------- ----------- ---------- ----------
工厂 管理人员 2000 310000 400000 1000 100204 218105 0 公积金 公积金

*/

drop table tb
dawugui 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 ljx85249201 的回复:]
现有表1
部门 人员类别 项目 借方科目 贷方科目 金额
工厂 管理人员 个人保险 100204 218105 1000
工厂 管理人员 单位保险 310000 400000 2000
....行数不一定

转化成
部门 人员类别 个人保险 借方科目 贷方科目 单位保险 借方科目 贷方科目
工厂 管理人员 1000 100204 218105 2000 310000 400000……
[/Quote]
不是已经给你写过了?
飘零一叶 2010-11-19
  • 打赏
  • 举报
回复
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
部门 NVARCHAR(100),
人员类别 NVARCHAR(100),
项目 NVARCHAR(100),
借方科目 NVARCHAR(100),
贷方科目 NVARCHAR(100),
金额 INT
)

INSERT INTO TB
SELECT '工厂','管理人员','个人保险','100204','218105',1000 UNION ALL
SELECT '工厂','管理人员','单位保险','310000','400000',2000 UNION ALL
SELECT '工厂','管理人员','人寿保险','310000','100204',3000 UNION ALL
SELECT '工厂','普通人员','人寿保险','218105','310000',3000 UNION ALL
SELECT '工厂','普通人员','单位保险','213232','213123',4089 UNION ALL
SELECT '工厂','高级领导','失业保险','454534','676767',4546

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL=ISNULL(@SQL+',','')+'MAX(CASE WHEN 项目='''+项目+''' THEN 金额 ELSE 0 END)'+项目+',[借方科目]=(CASE WHEN (MAX(CASE WHEN 项目='''+项目+''' THEN 金额 ELSE 0 END))=0 THEN 0 ELSE '''+借方科目+''' END)'+' ,[贷方科目]=(CASE WHEN (MAX(CASE WHEN 项目='''+项目+''' THEN 金额 ELSE 0 END))=0 THEN 0 ELSE '''+贷方科目+''' END)'FROM TB GROUP BY 部门,人员类别,项目,借方科目,贷方科目
SELECT @SQL='SELECT 部门,人员类别,项目,'+@SQL+' FROM TB'+' GROUP BY 部门,人员类别,项目,借方科目,贷方科目'
EXEC (@SQL)


-晴天 2010-11-19
  • 打赏
  • 举报
回复
找找大乌龟的例程,结合你的实际,聪明的你,一定会搞定它的!

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧