免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2184 | 回复: 6
打印 上一主题 下一主题

求统计一个表格中某代码某分类的值之和并生成新表格的查询语句。具体见贴内。谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-29 00:20 |只看该作者 |倒序浏览
代码        值        分类                                                       
        10101        5        101                                                       
        10101        5        102                                                       
        10101        10        101                                                       
        10102        68        102                                                       
        10201        2        101                                                       
        10201        25        6                                                       
        10202        55        6                                                       
                                =                101        102        6               
                                        10101        15        5        0               
                                        10102        0        68        0               
                                        10201        2        0        25               
                                        10202        0        0        55               


        说明:左上表中代码10101共有3条记录。有2条记录属于分类101,值之和为15;1条记录属于分类102,值之和为5。0条记录属于6,值之和为0。即求统计某代码某分类的值之和并生成右下角表格的查询语句。

论坛徽章:
0
2 [报告]
发表于 2006-07-29 00:55 |只看该作者
问题:你的分类有几种?
是不是只有101,102,6???

SQL只能根据得出按照你的分类的结果,
也就是说,如果你有N中分类.就要算N次.

我的建议:
最好用程序来实现

论坛徽章:
0
3 [报告]
发表于 2006-07-30 01:03 |只看该作者
代码有N个,分类也有N个。实际中代码N远大于分类N。
我是这么考虑的。
分多个步骤求解
1、
           101                    
10101        15                     
10102        0                       
10201        2                     
10202        0      
...
2、
            102                    
10101         5                        
10102         68                     
10201           0                     
10202           0                     
...
               
3、
                 6               
10101              0               
10102              0               
10201             25               
10202             55               
...
.
.
.

N.
                   N               
10101         0               
10102         0               
10201         25               
10202         55               
....

最后把N步连接起来

这个思路好呢,还是程序实现好?

论坛徽章:
0
4 [报告]
发表于 2006-07-30 01:36 |只看该作者
PHP5+mysql5
因后面还有更复杂的统计,我使用程序来实现了。利用二维数组来计算。现在担心运行的效率。希望大侠指点。

下面的代码是使用二维数组的方法,还没有进行N个分类统计计算(zrkd的key是wzdm,分类在其他的表中)。
         $tSQL="select wzdm,shl,shjje,shx from zrkd$strYear where month(rq)>='$strY1' and month(rq)<='$strY2' and (wzdm like '1%' or wzdm like '207%' or wzdm like '315%') ";
         echo $tSQL;
         $MySql_ID=mysql_db_query($db,$tSQL,$lianjie_id) or die("查询失败");

         while ($row=mysql_fetch_array($MySql_ID)) {
                 //总表本期收入
                 $zb[trim($row["wzdm"])]['bqsr']=0.0+$zb[trim($row["wzdm"])]['bqsr']+$row['shl'];
                 //附表1
                 $fb1[trim($row["wzdm"])]['bqsr']=0.0+$fb1[trim($row["wzdm"])]['bqsr']+$row['shl'];
                 switch (trim($row['shx'])){
                         case '自购':
                         $fb1[trim($row["wzdm"])]['zgshl']=0.0+$fb1[trim($row["wzdm"])]['zgshl']+$row['shl'];
                         $fb1[trim($row["wzdm"])]['zgshjje']=0.0+$fb1[trim($row["wzdm"])]['zgshjje']+$row['shjje'];
                         break;
                         case '甲方供料':
                         $fb1[trim($row("wzdm"))]['jfgl']=0.0+$fb1[trim($row("wzdm"))]['jfgl']+$row['shl'];
                         break;
                         case '内部调拔':
                         $fb1[trim($row["wzdm"])]['nbdb']=0.0+$fb1[trim($row["wzdm"])]['nbdb']+$row['shl'];
                         break;
                         default:
                         $fb1[trim($row["wzdm"])]['nbdb']=0.0+$fb1[trim($row["wzdm"])]['nbdb']+$row['shl'];
                         break;
                 }

         }

谢谢okchina

论坛徽章:
0
5 [报告]
发表于 2006-07-30 12:26 |只看该作者
to : linuxdp
你3楼的思路跟我差不多。
我是用程序实现来,然后再进行统计.
你4楼的代码我看不太懂.但是我想.可能case的就是你的分类.
我感觉算法不是很精练(水平有限,恳请指正.)

论坛徽章:
0
6 [报告]
发表于 2006-07-31 15:09 |只看该作者
3楼的多步骤求解也可用这个代码试试:

  1. select 代码, sum(值) as 值, 分类 from 表 group by 分类, 代码;
复制代码

如果正确无误,在此基础上用:

  1. select 代码,
  2.           max(case 分类 when 101 then 值 else 0 end) as `101`,
  3.           max(case 分类 when 102 then 值 else 0 end) as `102`,
  4.           max(case 分类 when 6 then 值 else 0 end) as `6`
  5. from
  6.   (select 代码, sum(值) as 值, 分类 from 表 group by 分类, 代码) as tmp
  7. group by 代码;
复制代码

第二个 SQL 中的 from 前面一段你可以用程序去构建,把分类读取到数组然后循环处理好了。

论坛徽章:
0
7 [报告]
发表于 2006-08-02 00:50 |只看该作者
不知道系统开销大不大?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP