散分:一个特简单查询SQL的几种写法

阿三 员工  2014-01-15 03:46:31
CREATE TABLE mytable(ID INT,VALUE NUMBER(6));
INSERT INTO mytable VALUES(1,10);
INSERT INTO mytable VALUES(2,20);
INSERT INTO mytable VALUES(3,15);

1 10
2 20
3 15

结果:
1 10 10
3 15 45
2 20 40


你会几种?

CREATE TABLE mytable(ID INT,VALUE NUMBER(6));
INSERT INTO mytable VALUES(1,10);
INSERT INTO mytable VALUES(2,20);
INSERT INTO mytable VALUES(3,15);

SELECT * FROM mytable;

SELECT a.id,a.value,SUM(nvl(a."VALUE",0))
FROM mytable A
JOIN mytable b ON b.id<=a.id
GROUP BY a.id,a.value

SELECT ID,VALUE,SUM(VALUE) OVER(ORDER BY ID) FROM mytable;

SELECT ID,value+LAG(VALUE,1,0) OVER(ORDER BY ID) FROM mytable
...全文
171 点赞 收藏 2
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿三 2014-01-18
第一个写错了,更正: SELECT a.id,a.value,SUM(nvl(b."VALUE",0)) FROM mytable A JOIN mytable b ON b.id<=a.id GROUP BY a.id,a.value 1,2结果是一样的,应该。 第三个确是我理解错了,巧合。
回复
shenlele088 2014-01-16
大哥,你这个样本给的有问题呀?你的这三个sql的意义也不一样。只不过恰巧得数一样了而已。 1、 SELECT a.id,a.value,SUM(nvl(a."VALUE",0)) FROM mytable A JOIN mytable b ON b.id<=a.id GROUP BY a.id,a.value 这个相当于order by value后的value*rownum。 2、 SELECT ID,VALUE,SUM(VALUE) OVER(ORDER BY ID) FROM mytable; 是ORDER BY ID后,当前value之和。 3、SELECT ID,value+LAG(VALUE,1,0) OVER(ORDER BY ID) FROM mytable 是ORDER BY ID后,上一个value+现在的value。 你可以试试下面的样本。 INSERT INTO mytable VALUES(1,5); INSERT INTO mytable VALUES(2,6); INSERT INTO mytable VALUES(3,10);
回复
发动态
发帖子
基础和管理
创建于2007-09-28

1.7w+

社区成员

Oracle 基础和管理
申请成为版主
社区公告
暂无公告