表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多个项目,一运行时就死机了.怎么办?请各位能否给个方法或建议.

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4534/4534879.xml?temp=.3198358
      

  2.   

    如果用SQL直接来实现会比较麻烦,建议到SQL栏去问.
      

  3.   

    我以前做过这样的报表,基本的思路是这样:
    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表插入到临时表里,我们只对那临时表操作.)
      
      

  4.   

    可以,有两种办法可以,
    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 
    这个是参考程序
      

  5.   

    TO ejc2001(易水寒) 
    xmf_jx 不就是要生成那样的表吗?你说的产生记录集,然后在程序里实现,还不是一条一条的循环,那程序还是可能会挂掉去.我所用的方法不在与它的记录总数.比如总数是1000条,如果按部门来算,最多的部门的项目是8条的话,那么只要循环八次就够了.而且他的项目基本上是以100为单位的.即使不为100,为50的话,都不会超出你所说的列数的.
      

  6.   

    select a.部门号,a.部门名称,(case b.项目代码 when 'S01' then b.项目名称 else '无' end) ,case b.项目代码 when 'S02' then b.项目名称 else '无' end) ,....
    from 表1 a, 表2 b,表3 c where a.部门号=c.部门号 and b.项目号=c.项目号自己再琢磨琢磨,用户select ..Case 肯定能实现
      

  7.   

    呵呵,感谢楼上各位大哥的指点。我用一个SQL语句搞定了,写了一个交叉表的SQL,就可以了。而且速度非常快。我现在100多个部门,40多个项目,生成这个报表只要3秒种就可以了。