表结构姓名       物品代码     物品名称              类别             日期
tom           1           Java书       书籍           2006-05-20
li            2           delphi书      书籍         2006-06-27
kk            3           手机        手机            2006-06-20 
yu            4           mp3                 数码产品         2006-07-20
tom           5           像机                数码产品         2006-07-20
li            6           U盘                 存储设备         2006-08-20
tom           7           移动硬盘            存储设备         2006-08-26
kk            8           DV                  数码产品         2006-08-27根据日期查询生成如下报表姓名       书籍   手机    数码产品    存储设备
tom         1          0       1           1
li          1          0       0           1  
kk          0          1       1           0  
yu          0          0       1           0 因为数据很多,所以查询速度比较慢,才考虑用存储过程,根据日期统计出来的数据插入到一个临时表中,每次查询先清空临时表.分类比较多,但是是固定的(就10类吧),根据物品代码来对应分类,也是固定的(有一个代码对应一个分类,也有多个代码对应一个分类).

解决方案 »

  1.   

    select 姓名, sum(decode(类别,'书籍',1,0)) as '书籍',sum(decode(类别,'手机',1,0)) as '手机', sum(decode(类别,'数码产品',1,0)) as '数码产品',sum(decode(类别,'存储设备',1,0)) as '存储设备'
    from tab_name 
    where 日期 >= &sdate and 日期 <= &edate
    group by 姓名
      

  2.   

    TO:xiaoxiao1984(笨猫儿^_^) 
    谢谢!有多种物品对应一个分类,并且在表结构中不存在分类这个字段的,但知道哪几个物品代码对应这个分类.这样写sql语句能统计出来吗?
      

  3.   

    如果代码数量不多,可以使用笨猫儿^_^) 的方法sum(decode(物品代码,'1',1,'2',1,0)) as '书籍' --1 Java书 2 delphi书.
    ……
    sum(decode(物品代码,'4',1,'5',1,'8',1,0)) as '数码产品'
    ……
    要是代码数量很多的话,建议作一个物品代码字典表,再联合查询。
      

  4.   

    楼上两位的方法可行,其实不一定要用存储过程,这本身就一条sql。
    数据量大的话,最好是先把要统计的数据查询出来保存到客户端,然后再对结果进行分类统计处理。如果客户端把临时数据保存到access表当中,这样就更方便了,再对它进行上面两位说的查询。这样效果最好。
      

  5.   

    建议建立一个物品代码字典表(物品代码,类别),这样可以灵活控制某种物品的分类,增加或者删除物品也会比较简单,不至于重新修改sql语句select a.姓名, sum(decode(b.类别,'书籍',1,0)) as '书籍',sum(decode(b.类别,'手机',1,0)) as '手机', sum(decode(b.类别,'数码产品',1,0)) as '数码产品',sum(decode(b.类别,'存储设备',1,0)) as '存储设备'
    from tab_name a , 物品代码字典表 b 
    where a.物品代码 = b.物品代码
    and a.日期 >= &sdate and a.日期 <= &edate
    group by a.姓名为什么一定需要存储过程呢?
      

  6.   

    insert into old_table select * from new_table