免费注册 查看新帖 |

Chinaunix

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

PL SQL sum求和 循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-11 19:27 |只看该作者 |倒序浏览
有一个表,字段如下

sn,user,type1,ac1,type2,ac2,type3,ac3,cos ;
SN是唯一的主键

若type1=2000,则取出ac1,
若type2=2000,则取出ac2,
若type3=2000,则取出ac3,

在一行数据里面type1,type2,type3有一个或者两个等于2000,也可能没有一个等于2000。
若有两个都等于2000,那么把相对的ac字段相加

最后要求返回
user 和 相对应的user的所有ac相加的和

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-11-11 19:43 |只看该作者
不太清楚楼主的意思。明天到单位帮你试试(单位有环境)

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
3 [报告]
发表于 2010-11-12 08:29 |只看该作者
不太明白楼主的意思

特别是最后返回user和所有ac的和,这个和是按照上的type1/2/3是否等于2000,所取得的ac值相加之和么?


楼主需要提供测试环境,我这里有个,仅供参考:

  1. Insert into T1
  2.    (SN, USR, TYPE1, TYPE2, TYPE3, AC1, AC2, AC3)
  3. Values
  4.    (1, 'zs', 1000, 2000, 200, 100, 100, 100);
  5. Insert into T1
  6.    (SN, USR, TYPE1, TYPE2, TYPE3, AC1, AC2, AC3)
  7. Values
  8.    (2, 'ls', 2000, 100, 2000, 200, 200, 300);
  9. Insert into T1
  10.    (SN, USR, TYPE1, TYPE2, TYPE3, AC1, AC2, AC3)
  11. Values
  12.    (3, 'ww', 10, 0, 0, 100, 200, 300);
  13. Insert into T1
  14.    (SN, USR, TYPE1, TYPE2, TYPE3, AC1, AC2, AC3)
  15. Values
  16.    (4, 'qw', 2000, 2000, 2000, 100, 200, 300);
复制代码
以下仅供参考:
  1. select usr,
  2.        case when type1=2000 then ac1 else 0 end +
  3.        case when type2=2000 then ac2 else 0 end +
  4.        case when type3=2000 then ac3 else 0 end accou
  5.   from  t1
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-11-12 17:45 |只看该作者
多谢三楼回复,我不太会PLSQL
根据你的结果,我又修改了一下。

如下:
  1. select t2.usr, sum(t2.accou)  from
  2. (select usr,
  3.        case when type1=2000 then ac1 else 0 end +
  4.        case when type2=2000 then ac2 else 0 end +
  5.        case when type3=2000 then ac3 else 0 end accou
  6.   from  t1) t2

  7. group by t2.usr order by sum(t2.accou)
  8.   
复制代码
表内数据一万行,没有索引,运行速度好慢啊,平时都是根据SN来查询数据的,突然要统计一次数据,也不能建新索引的。。

还是非常感谢3楼的回复,对我有不小帮助。让我改写出了新的SQL,就是不知道这个SQL还有没有优化的空间。

论坛徽章:
0
5 [报告]
发表于 2010-11-13 08:30 |只看该作者
select usr,
       sum(case when type1=2000 then ac1 else 0 end +
       case when type2=2000 then ac2 else 0 end +
       case when type3=2000 then ac3 else 0 end) accou
  from  t1
group by usr order by 2;

这样速度应该快一些,一遍全表扫描足以,而且不占用内存和临时表空间。

最近改SQL Server程序,发现好多自认为熟悉SQL Server的实际上根本不懂,基本的常识和优化技巧都不懂,把整个SQL Server当成一个黑盒对待。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP