表1:dept
部门号 部门名称
001 AAAA
002 BBBB
...
表2:item
项目号 项目名称
S01 AABB
S02 AACC
S03 AADD
S04 AAEE
...
表3:Pz
部门号 项目号 金额
001 S01 500
001 S02 600
001 S03 900
001 S04 1000
002 S01 300
002 S02 400
002 S04 500
------------------------------------------现在要生成如下结构的表,该怎么写?
部门号 部门名称 AABB AACC AADD AAEE .... (---->这里是项目)
001 AAAA 500 600 900 1000
002 BBBB 300 400 500 意思就是说:把所有项目名称变成新表的列,所有的部门变成新表的行,再根据Pz表生成相对应的数据.
我当时的作法是,先把项目名称写到一个表格中,再把部门也增加到该表格中,再通过表格的行与列循环,逐个单元格进行计算,把得到的数字写进去.但这个方法运行太慢了,几个部门,几个项目倒没有什么问题,我现是100多个部门,40多个项目,一运行时就死机了.怎么办?请各位能否给个方法或建议.
部门号 部门名称
001 AAAA
002 BBBB
...
表2:item
项目号 项目名称
S01 AABB
S02 AACC
S03 AADD
S04 AAEE
...
表3:Pz
部门号 项目号 金额
001 S01 500
001 S02 600
001 S03 900
001 S04 1000
002 S01 300
002 S02 400
002 S04 500
------------------------------------------现在要生成如下结构的表,该怎么写?
部门号 部门名称 AABB AACC AADD AAEE .... (---->这里是项目)
001 AAAA 500 600 900 1000
002 BBBB 300 400 500 意思就是说:把所有项目名称变成新表的列,所有的部门变成新表的行,再根据Pz表生成相对应的数据.
我当时的作法是,先把项目名称写到一个表格中,再把部门也增加到该表格中,再通过表格的行与列循环,逐个单元格进行计算,把得到的数字写进去.但这个方法运行太慢了,几个部门,几个项目倒没有什么问题,我现是100多个部门,40多个项目,一运行时就死机了.怎么办?请各位能否给个方法或建议.
1:根据表3:Pz找出拥有数据量最多的部门,根据这个最大数生成一个临时表:假如部门001是最大的记录(4条),那么产生有六个字段的临时表,其中项目列有4列
select max(counts) from
(select count(*) as counts,部门号 from Pz group by 部门号) a --假如上面求出的是4则可以生成下面的SQL语句(在数据库里面要动态生成SQL语句) select ' ' as 部门号,' ' as 部门名称 0 as 金额1, 0 as 金额2, 0 as 金额3,0 as 金额 4
into #temp_table2:然后根据表3:Pz的部门插入记录(只插入部门,及部门名称).一个部门一条记录,这一步我相信你会处理3以该最大数作为循环次数开始循环.循环体是:将表3:Pz按部门找出金额最小的那条记录来更新临时表,如上面所说我们的最大循环是四.在循环中将表3:Pz中以部门分组金饿最小的那条记录来更新临时表.更新后再删除表3:Pz表中最小的那条记录(即让下次循环时候排除我们刚用过的记录,当然在你实际中,你最好将表3:Pz表插入到临时表里,我们只对那临时表操作.)
id a b c
1 小王 8 1
1 小王 5 1
1 小王 2 1
1 小王 4 0
1 小王 6 0
2 小李 7 1
2 小李 4 1
2 小李 5 1
2 小李 8 0
说明:id 和 a始终相配,c不是0就是1
如何得到:
id a x y
1 小王 15 10
2 小李 16 8
说明:x的值是c=1的b的总数,y的值是c=0的
SELECT distinct id, a,
(SELECT SUM(b)
FROM aa AS User_1
WHERE C = 1 AND User_1.A = aa.A) AS X,
(SELECT SUM(B)
FROM aa AS User_2
WHERE C = 0 AND User_2.A = aa.A) AS Y
FROM aa
select a1.id,a1.a,x,y from
(select id ,a , sum(b) as x
from aa
where c=1
group by id,a,c) as a1
left join
(select id,a, sum(b) as y
from aa
where c=0
group by id,a,c) as a2
on a1.id=a2.id
这个是参考程序
xmf_jx 不就是要生成那样的表吗?你说的产生记录集,然后在程序里实现,还不是一条一条的循环,那程序还是可能会挂掉去.我所用的方法不在与它的记录总数.比如总数是1000条,如果按部门来算,最多的部门的项目是8条的话,那么只要循环八次就够了.而且他的项目基本上是以100为单位的.即使不为100,为50的话,都不会超出你所说的列数的.
from 表1 a, 表2 b,表3 c where a.部门号=c.部门号 and b.项目号=c.项目号自己再琢磨琢磨,用户select ..Case 肯定能实现