﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-liuyz2006-文章分类-oracle</title><link>http://www.blogjava.net/liuyz2006/category/50543.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 12 Feb 2014 04:54:24 GMT</lastBuildDate><pubDate>Wed, 12 Feb 2014 04:54:24 GMT</pubDate><ttl>60</ttl><item><title>ORACLE PL/SQL编程之把游标说透</title><link>http://www.blogjava.net/liuyz2006/articles/409740.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Tue, 11 Feb 2014 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/409740.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;　　本篇主要内容如下：&nbsp; 　　4.1&nbsp;游标概念&nbsp;　　4.1.1&nbsp;处理显式游标&nbsp;　　4.1.2&nbsp;处理隐式游标&nbsp;　　4.1.3&nbsp;关于&nbsp;NO_DATA_FOUND&nbsp;和&nbsp;%NOTFOUND的区别&nbsp;　　4.1.4&nbsp;&nbsp;使用游标更...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/409740.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/409740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2014-02-11 18:55 <a href="http://www.blogjava.net/liuyz2006/articles/409740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle学习网站</title><link>http://www.blogjava.net/liuyz2006/articles/397370.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Wed, 03 Apr 2013 10:32:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/397370.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/397370.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/397370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/397370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/397370.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/wh62592855/article/category/623752">http://blog.csdn.net/wh62592855/article/category/623752</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/397370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2013-04-03 18:32 <a href="http://www.blogjava.net/liuyz2006/articles/397370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 经典优化34条 </title><link>http://www.blogjava.net/liuyz2006/articles/382782.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Wed, 11 Jul 2012 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/382782.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/382782.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/382782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/382782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/382782.html</trackback:ping><description><![CDATA[<div><span><a href="http://sishuok.com/forum/blogPost/list/4140.html" title="经典优化34条"></a></span><br />    						   <div><p>（1） 选择最有效率的表名顺序(只在基于规则的优化器中有效)： <br />ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving  table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询,  那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. <br />（2） WHERE子句中的连接顺序．： <br />ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. <br />（3） SELECT子句中避免使用 &#8216; * &#8216;： <br />ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 <br />（4） 减少访问数据库的次数： <br />ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等； <br />（5） 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 <br />（6） 使用DECODE函数来减少处理时间： <br />使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. <br />（7） 整合简单,无关联的数据库访问： <br />如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) <br />（8） 删除重复记录： <br />最高效的删除重复记录方法 ( 因为使用了ROWID)例子： <br />DELETE FROM EMP E WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) <br />FROM EMP X WHERE X.EMP_NO = E.EMP_NO); <br />（9） 用TRUNCATE替代DELETE： <br />当 删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息.  如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时,  回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按:  TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) <br />（10） 尽量多使用COMMIT： <br />只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: <br />COMMIT所释放的资源: <br />a. 回滚段上用于恢复数据的信息. <br />b. 被程序语句获得的锁 <br />c. redo log buffer 中的空间 <br />d. ORACLE为管理上述3种资源中的内部花费 <br />（11） 用Where子句替换HAVING子句： <br />避 免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作.  如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.  (非oracle中)on、where、having这三个都可以加条件的子句中，on是最先执行，where次之，having最后，因为on是先把不 符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的，where也应该比having快点的，因为它过滤数据后 才进行sum，在两个表联接时才用on的，所以在一个表的时候，就剩下where跟having比较了。在这单表查询统计的情况下，如果要过滤的条件没有 涉及到要计算字段，那它们的结果是一样的，只是where可以使用rushmore技术，而having就不能，在速度上后者要慢如果要涉及到计算的字 段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程，where的作用时间是在计算之前就完成的，而having就是在计算后才起作 用的，所以在这种情况下，两者的结果会不同。在多表联接查询时，on比where更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表 后，再由where进行过滤，然后再计算，计算完后再由having进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候 起作用，然后再决定放在那里 <br />（12） 减少对表的查询： <br />在含有子查询的SQL语句中,要特别注意减少对表的查询.例子： <br />SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT <br />TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) <br />子查询，要使用关联子查询才会高效<br />（13） 通过内部函数提高SQL效率.： <br />复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的 <br />（14） 使用表的别名(Alias)： <br />当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. <br />（15） 用EXISTS替代IN、用NOT EXISTS替代NOT IN： <br />在 许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT  EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的  (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT  EXISTS. <br />例子： <br />（高效）SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND  EXISTS (SELECT &#8216;X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC =  &#8216;MELB') <br />(低效)SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = &#8216;MELB') <br />（16） 识别'低效执行'的SQL语句： <br />虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法： <br />SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, <br />ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, <br />ROUND(DISK_READ*ECUTIONS,2) Reads_per_run, <br />SQL_TEXT <br />FROM V$SQLAREA <br />WHERE EXECUTIONS&gt;0 <br />AND BUFFER_GETS &gt; 0 <br />AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 <br />ORDER BY 4 DESC; <br />（17） 用索引提高效率： <br />索 引是表的一个概念部分,用来提高检索数据的效率，ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快.  当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.  另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列.  通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.  虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,  索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O .  因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.： <br />ALTER INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt; <br />（18） 用EXISTS替换DISTINCT： <br />当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子： <br />(低效): <br />SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E <br />WHERE D.DEPT_NO = E.DEPT_NO <br />(高效): <br />SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT &#8216;X' <br />FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); <br />（19） sql语句用大写的；因为oracle总是先解析sql语句，把小写的字母转换成大写的再执行 <br />（20） 在java代码中尽量少用连接符&#8220;＋&#8221;连接字符串！ <br />（21） 避免在索引列上使用NOT 通常， <br />我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE&#8221;遇到&#8221;NOT,他就会停止使用索引转而执行全表扫描. <br />（22） 避免在索引列上使用计算． <br />WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． <br />举例: <br />低效： <br />SELECT &#8230; FROM DEPT WHERE SAL * 12 &gt; 25000; <br />高效: <br />SELECT &#8230; FROM DEPT WHERE SAL &gt; 25000/12; <br />（23） 用&gt;=替代&gt; <br />高效: <br />SELECT * FROM EMP WHERE DEPTNO &gt;=4 <br />低效: <br />SELECT * FROM EMP WHERE DEPTNO &gt;3 <br />两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. <br />（24） 用UNION替换OR (适用于索引列) <br />通 常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效.  如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. <br />高效: <br />SELECT LOC_ID , LOC_DESC , REGION <br />FROM LOCATION <br />WHERE LOC_ID = 10 <br />UNION <br />SELECT LOC_ID , LOC_DESC , REGION <br />FROM LOCATION <br />WHERE REGION = &#8220;MELBOURNE&#8221; <br />低效: <br />SELECT LOC_ID , LOC_DESC , REGION <br />FROM LOCATION <br />WHERE LOC_ID = 10 OR REGION = &#8220;MELBOURNE&#8221; <br />如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. <br />（25） 用IN来替换OR <br />这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的． <br />低效: <br />SELECT&#8230;. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 <br />高效 <br />SELECT&#8230; FROM LOCATION WHERE LOC_IN IN (10,20,30); <br />（26） 避免在索引列上使用IS NULL和IS NOT NULL <br />避 免在索引中使用任何可以为空的列，ORACLE将无法使用该索引．对于单列索引，如果列包含空值，索引中将不存在此记录.  对于复合索引，如果每个列都为空，索引中同样不存在此记录. 如果至少有一个列不为空，则记录存在于索引中．举例:  如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) ,  ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入).  然而如果所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空!  因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引. <br />低效: (索引失效) <br />SELECT &#8230; FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; <br />高效: (索引有效) <br />SELECT &#8230; FROM DEPARTMENT WHERE DEPT_CODE &gt;=0; <br />（27） 总是使用索引的第一个列： <br />如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则，当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 <br />（28） 用UNION-ALL 替换UNION ( 如果有可能的话)： <br />当 SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION  ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录.  因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION  将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的.  下面的SQL可以用来查询排序的消耗量 <br />低效： <br />SELECT ACCT_NUM, BALANCE_AMT <br />FROM DEBIT_TRANSACTIONS <br />WHERE TRAN_DATE = '31-DEC-95' <br />UNION <br />SELECT ACCT_NUM, BALANCE_AMT <br />FROM DEBIT_TRANSACTIONS <br />WHERE TRAN_DATE = '31-DEC-95' <br />高效: <br />SELECT ACCT_NUM, BALANCE_AMT <br />FROM DEBIT_TRANSACTIONS <br />WHERE TRAN_DATE = '31-DEC-95' <br />UNION ALL <br />SELECT ACCT_NUM, BALANCE_AMT <br />FROM DEBIT_TRANSACTIONS <br />WHERE TRAN_DATE = '31-DEC-95' <br />（29） 用WHERE替代ORDER BY： <br />ORDER BY 子句只在两种严格的条件下使用索引. <br />ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. <br />ORDER BY中所有的列必须定义为非空. <br />WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. <br />例如: <br />表DEPT包含以下列: <br />DEPT_CODE PK NOT NULL <br />DEPT_DESC NOT NULL <br />DEPT_TYPE NULL <br />低效: (索引不被使用) <br />SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE <br />高效: (使用索引) <br />SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE &gt; 0 <br />（30） 避免改变索引列的类型.: <br />当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. <br />假设 EMPNO是一个数值类型的索引列. <br />SELECT &#8230; FROM EMP WHERE EMPNO = &#8216;123' <br />实际上,经过ORACLE类型转换, 语句转化为: <br />SELECT &#8230; FROM EMP WHERE EMPNO = TO_NUMBER(&#8216;123') <br />幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. <br />现在,假设EMP_TYPE是一个字符类型的索引列. <br />SELECT &#8230; FROM EMP WHERE EMP_TYPE = 123 <br />这个语句被ORACLE转换为: <br />SELECT &#8230; FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 <br />因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型 <br />（31） 需要当心的WHERE子句: <br />某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. <br />在 下面的例子里, (1)&#8216;!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2)  &#8216;||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) &#8216;+'是数学函数. 就象其他数学函数那样, 停用了索引.  (4)相同的索引列不能互相比较,这将会启用全表扫描. <br />（32） a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高. <br />b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍! <br />（33） 避免使用耗费资源的操作: <br />带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 <br />执 行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS ,  INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS,  INTERSECT也是可以考虑的, 毕竟它们的可读性很强 <br />（34） 优化GROUP BY: <br />提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多. <br />低效: <br />SELECT JOB , AVG(SAL) <br />FROM EMP <br />GROUP JOB <br />HAVING JOB = &#8216;PRESIDENT' <br />OR JOB = &#8216;MANAGER' <br />高效: <br />SELECT JOB , AVG(SAL) <br />FROM EMP <br />WHERE JOB = &#8216;PRESIDENT' <br />OR JOB = &#8216;MANAGER' <br />GROUP JOB</p></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/382782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-07-11 11:27 <a href="http://www.blogjava.net/liuyz2006/articles/382782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle over函数 </title><link>http://www.blogjava.net/liuyz2006/articles/370739.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 24 Feb 2012 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/370739.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/370739.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/370739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/370739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/370739.html</trackback:ping><description><![CDATA[Oracle over函数 
<div id="app-share-container">
<div id="appShareOpt"></div>
<div id="app-share-content">
<p style="margin: 20px auto 10px" class="g_p_center g_t_wrap g_t_left g_t_20 g_c_pdin c07"></p>
<div class="g_blog_list">
<div class="g_t_center g_c_pdin g_p_center c07 content">
<div class="ns_content">
<div class="show_ask"><font size="2">SQL code: <br /><br />sql over的作用及用法<br />RANK ( ) OVER ( [query_partition_clause] order_by_clause )<br />DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )<br />可实现按指定的字段分组排序，对于相同分组字段的结果集进行排序,<br />其中PARTITION BY 为分组字段，ORDER BY 指定排序字段<br /><br /><br />over不能单独使用，要和分析函数：rank(),dense_rank(),row_number()等一起使用。<br /><font color="#0000ff">其参数：over（partition by columnname1 order by columnname2）<br />含义：按columname1指定的字段进行分组排序，或者说按字段columnname1的值进行分组排序。<br /></font>例如：employees表中，有两个部门的记录：department_id ＝10和20<br />select department_id，rank（） over（partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名，在部门20中进行薪水排名。如果是partition by org_id，则是在整个公司内进行排名。<br /><br /><br /></font></div>
<div class="show_ask"><font size="2">SQL code: <br />WITH<br />OBJ AS(<br />SELECT<br />name, type</font></div>
<p>&nbsp;</p>
<p><font size="2">目的：以oracle自带的scott模式为测试环境，主要通过试验体会分析函数的用法。<br /><br />类似 sum(...) over ... 的使用<br /><br /><br />1.原表信息：<br /><br />SQL&gt; break on deptno skip 1 -- 为效果更明显，把不同部门的数据隔段显示。<br />SQL&gt; select deptno,ename,sal<br />2 from emp<br />3 order by deptno;<br /><br />&nbsp;&nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL<br />---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250<br /><br /><br />已选择14行。<br /><br /><br /><br />2.先来一个简单的，注意over(...)条件的不同，<br />使用 sum(sal) over (order by ename)... 查询员工的薪水&#8220;连续&#8221;求和,<br />注意over (order by ename)如果没有order by 子句，求和就不是&#8220;连续&#8221;的，<br />放在一起，体会一下不同之处：<br /><br />SQL&gt; break on '' -- 取消数据分段显示<br />SQL&gt; select deptno,ename,sal,<br />2 sum(sal) over (order by ename) 连续求和,<br />3 sum(sal) over () 总和,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 此处sum(sal) over () 等同于sum(sal)<br />4 100*round(sal/sum(sal) over (),4) "份额(%)"<br />5 from emp<br />6 /<br /><br />&nbsp;&nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp; 连续求和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总和&nbsp;&nbsp;&nbsp; 份额(%)<br />---------- ---------- ---------- ---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.79<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2700&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.51<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5550&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.82<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.44<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.34<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.27<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14925&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.25<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19925&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.23<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21175&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.31<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22475&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.48<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25475&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.34<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26275&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.76<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27775&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.17<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.31<br /><br />已选择14行。<br /><br /><br />3.使用子分区查出各部门薪水连续的总和。注意按部门分区。注意over(...)条件的不同，<br />sum(sal) over (partition by deptno order by ename) 按部门&#8220;连续&#8221;求总和<br />sum(sal) over (partition by deptno) 按部门求总和<br />sum(sal) over (order by deptno，ename) 不按部门&#8220;连续&#8221;求总和<br />sum(sal) over () 不按部门，求所有员工总和，效果等同于sum(sal)。<br /><br />SQL&gt; break on deptno skip 1 -- 为效果更明显，把不同部门的数据隔段显示。<br />SQL&gt; select deptno,ename,sal,<br /><font color="#ff0000">2 sum(sal) over (partition by deptno order by ename) 部门连续求和,--各部门的薪水"连续"求和<br />3 sum(sal) over (partition by deptno) 部门总和, -- 部门统计的总和，同一部门总和不变<br />4 100*round(sal/sum(sal) over (partition by deptno),4) "部门份额(%)",<br />5 sum(sal) over (order by deptno,ename) 连续求和, --所有部门的薪水"连续"求和<br />6 sum(sal) over () 总和, -- 此处sum(sal) over () 等同于sum(sal)，所有员工的薪水总和<br /></font>7 100*round(sal/sum(sal) over (),4) "总份额(%)"<br />8 from emp<br />9 /<br /><br />DEPTNO ENAME&nbsp;&nbsp;&nbsp; SAL 部门连续求和&nbsp;&nbsp; 部门总和 部门份额(%)&nbsp;&nbsp; 连续求和&nbsp;&nbsp; 总和 总份额(%)<br />------ ------ ----- ------------ ---------- ----------- ---------- ------ ----------<br />&nbsp;&nbsp;&nbsp; 10 CLARK&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.44<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KING&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 57.14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7450 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.23<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MILLER 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14.86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.48<br /><br />&nbsp;&nbsp;&nbsp; 20 ADAMS&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9850 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.79<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FORD&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27.59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12850 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.34<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp; 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7075&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27.36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15825 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.25<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCOTT&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10075&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27.59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18825 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.34<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMITH&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19625 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.76<br /><br />&nbsp;&nbsp;&nbsp; 30 ALLEN&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21225 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.51<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLAKE&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30.32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24075 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.82<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAMES&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25025 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.27<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MARTIN 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6650&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26275 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.31<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TURNER 1500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15.96&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27775 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.17<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARD&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025 29025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.31<br /><br /><br />已选择14行。<br /><br /><br /><br />4.来一个综合的例子，求和规则有按部门分区的，有不分区的例子<br />SQL&gt; select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,<br />2 sum(sal) over (order by deptno,sal) sum<br />3 from emp;<br /><br />&nbsp;&nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp; DEPT_SUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM<br />---------- ---------- ---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3750<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9550<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1900&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10650<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13625<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19625<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19625<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20575<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23075<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23075<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24575<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6550&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26175<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025<br /><br /><br />已选择14行。<br /><br /><br /><br />5.来一个逆序的，即部门从大到小排列，部门里各员工的薪水从高到低排列，累计和的规则不变。<br /><br />SQL&gt; select deptno,ename,sal,<br />2 sum(sal) over (partition by deptno order by deptno desc,sal desc) dept_sum,<br />3 sum(sal) over (order by deptno desc,sal desc) sum<br />4 from emp;<br /><br />&nbsp;&nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp; DEPT_SUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM<br />---------- ---------- ---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4450<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5950<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8450<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8450<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15400<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15400<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18375<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10075&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19475<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20275<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25275<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27725<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025<br /><br /><br />已选择14行。<br /><br /><br /><br />6.体会：在"... from emp;"后面不要加order by 子句，使用的分析函数的(partition by deptno order by sal)<br />里已经有排序的语句了，如果再在句尾添加排序子句，一致倒罢了，不一致，结果就令人费劲了。如：<br /><br />SQL&gt; select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,<br />2 sum(sal) over (order by deptno,sal) sum<br />3 from emp<br />4 order by deptno desc;<br /><br />&nbsp;&nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp; DEPT_SUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM<br />---------- ---------- ---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20575<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23075<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23075<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24575<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6550&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26175<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29025<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9550<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1900&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10650<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13625<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19625<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19625<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3750<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750<br /><br /><br />已选择14行<br /><br /><br />==================================================================<br />利用over实现的分页功能：<br />--假设co<wbr></wbr>de1,co<wbr></wbr>de2为用来分页的KEY，每页显示5第数据<br />select co<wbr></wbr>de1,co<wbr></wbr>de2,co<wbr></wbr>de3,<br />ceil(count(*) over(partition by co<wbr></wbr>de1,co<wbr></wbr>de2 order by rownum)/5), <br />count(*) over(partition by co<wbr></wbr>de1,co<wbr></wbr>de2)<br />from ma_kbn order by co<wbr></wbr>de1,co<wbr></wbr>de2<br /><br />==================================================================<br /><br /></font></p></div></div></div></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/370739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-02-25 00:19 <a href="http://www.blogjava.net/liuyz2006/articles/370739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 报表函数</title><link>http://www.blogjava.net/liuyz2006/articles/370738.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 24 Feb 2012 16:13:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/370738.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/370738.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/370738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/370738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/370738.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div class="tit">oracle 报表函数</div>
<p>
<table style="width: 100%; table-layout: fixed">
<tbody>
<tr>
<td>
<div id="blog_text" class="cnt">
<p><span style="font-family: Verdana; font-size: 12px"><strong>一、报表函数简介：<br /><br /></strong>回顾一下前面《</span><a href="http://www.blogjava.net/pengpenglin/archive/2008/06/28/211334.html" target="_blank"><span style="font-family: Verdana; color: #638f27; font-size: 12px">Oracle开发专题之：窗口函数</span></a><span style="font-family: Verdana; font-size: 12px">》中关于</span><a style="font-family: Verdana; font-size: 10pt" href="http://www.blogjava.net/pengpenglin/archive/2008/06/28/211334.html#part2" target="_blank"><span style="color: #638f27">全统计</span></a><span style="font-family: Verdana; font-size: 10pt">一节，我们使用了Oracle提供的： </span></p>
<p><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #ff00ff">sum</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales))&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">month</span><span style="color: #000000">&nbsp;rows&nbsp;</span><span style="color: #808080">between</span><span style="color: #000000">&nbsp;unbounded&nbsp;preceding&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;unbounded&nbsp;following)</span> </p>
<p><br />来统计全年的订单总额，这个函数会在记录集形成的过程中，每检索一条记录就执行一次，它总共执行了12次。这是非常费时的。实际上我们还有更简便的方法： </p>
<p><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">month</span><span style="color: #000000">,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales)&nbsp;month_sales,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales))&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">month</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows&nbsp;</span><span style="color: #808080">between</span><span style="color: #000000">&nbsp;unbounded&nbsp;preceding&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;unbounded&nbsp;following)&nbsp;win_sales,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff"><span style="background-color: #00ff00"><span style="color: #ff00ff">sum</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales))&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">()&nbsp;</span></span></span><span style="color: #000000">rpt_sales<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;orders<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">7</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">month</span><span style="color: #000000">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">MONTH</span><span style="color: #000000">&nbsp;MONTH_SALES&nbsp;WINDOW_SALES&nbsp;REPORT_SALES<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;-----------&nbsp;------------&nbsp;------------</span><span style="color: #008080"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">610697</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">428676</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">637031</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">541146</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">592935</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">501485</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">7</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">606914</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">8</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">460520</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">9</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">392898</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">10</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">510117</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">11</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">532889</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">12</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">492458</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">6307766</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />已选择12行。</span> </p>
<p><br />over函数的空括号表示该记录集的所有记录都应该被列入统计的范围，如果使用了partition by则先分区，再依次统计各个分区。<br /><br /><strong><a target="_blank"></a>二、RATIO_TO_REPORT函数：<br /></strong><br />报表函数特(窗口函数)特别适合于报表中需要同时显示详细数据和统计数据的情况。例如在销售报告中经常会出现这样的需求：列出上一年度每个月的销售总额、年底销售额以及每个月的销售额占全年总销售额的比例：<br /><br />方法&#9312;: </p>
<p><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;all_sales.</span><span style="color: #808080">*</span><span style="color: #000000">,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold">100</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">round</span><span style="color: #000000">(cust_sales&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;region_sales,&nbsp;</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">||</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">Percent</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;o.cust_nbr&nbsp;customer,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.region_id&nbsp;region,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(o.tot_sales)&nbsp;cust_sales,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(o.tot_sales))&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;o.region_id)&nbsp;region_sales<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;orders_tmp&nbsp;o<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;o.</span><span style="color: #ff00ff">year</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000; font-weight: bold">2001</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;o.region_id,&nbsp;o.cust_nbr)&nbsp;all_sales<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;all_sales.cust_sales&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;all_sales.region_sales&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800000; font-weight: bold">0.2</span><span style="color: #000000">;</span> </p>
<p><br />这是一种笨方法也是最易懂的方法。<br /><br />方法&#9313;： </p>
<p><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id,&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales)&nbsp;sp_sales,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff"><span style="background-color: #00ff00"><span style="color: #ff00ff">round</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales)</span></span></span><span style="color: #000000"><span style="background-color: #00ff00"><span style="color: #000000">&nbsp;</span><span style="color: #808080">/&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales)</span></span></span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">&nbsp;(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id),&nbsp;</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">)&nbsp;percent_of_region<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;orders<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">year</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000; font-weight: bold">2001</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id;</span> </p>
<p><br />方法&#9314; </p>
<p><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id,&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales)&nbsp;sp_sales,<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff"><span style="background-color: #00ff00"><span style="color: #ff00ff">round</span><span style="color: #000000">(<strong>ratio_to_report</strong>(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(tot_sales))</span></span></span><span style="color: #000000">&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">&nbsp;(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id),&nbsp;</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">)&nbsp;sp_ratio<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;orders<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">year</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000; font-weight: bold">2001</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;region_id,&nbsp;salesperson_id;</span></p></div></td></tr></tbody></table><br /></p><img src ="http://www.blogjava.net/liuyz2006/aggbug/370738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-02-25 00:13 <a href="http://www.blogjava.net/liuyz2006/articles/370738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 分析函数(转)</title><link>http://www.blogjava.net/liuyz2006/articles/370737.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 24 Feb 2012 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/370737.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/370737.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/370737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/370737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/370737.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; oracle分析函数 分类： Oracle 2011-04-13 23:50 273人阅读 评论(0) 收藏 举报 &nbsp;Oracle开发专题之：分析函数(OVER)Oracle开发专题之：分析函数2(Rank, Dense_rank, row_number)Oracle开发专题之：分析函数3(Top/Bottom N、First/Last、...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/370737.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/370737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-02-25 00:03 <a href="http://www.blogjava.net/liuyz2006/articles/370737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 分析函数的使用 </title><link>http://www.blogjava.net/liuyz2006/articles/370733.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 24 Feb 2012 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/370733.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/370733.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/370733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/370733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/370733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Oracle 分析函数的使用 Oracle 分析函数的使用Oracle 分析函数使用介绍&nbsp; &nbsp;分析函数是oracle816引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在只要一条简单的sql语句就可以实现了,而且在执行效率方面也有相当大的提高.下面我将针对分...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/370733.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/370733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-02-24 23:01 <a href="http://www.blogjava.net/liuyz2006/articles/370733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>group by后使用rollup子句总结 </title><link>http://www.blogjava.net/liuyz2006/articles/370728.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 24 Feb 2012 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/370728.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/370728.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/370728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/370728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/370728.html</trackback:ping><description><![CDATA[group by后使用rollup子句总结 
<div id="appShareOpt"></div>
<div id="app-share-content">
<p align="center"></p>
<p style="text-indent: 21pt">今天接触到了group by后带rollup子句的用法（真是丑死人了，接触ORACLE一两年了今天才知道还有这样一个用法），group by后带rollup子句这个子句所产生的功能实在是太高级了，见了就高兴。但<a href="http://hi.baidu.com/df_world/blog/item/:;" target="_self" onxxxxx="javascript:tagshow(event, &amp;apos;#39;%D1%A7%CF%B0&amp;apos;#39;);"><u><strong>学习</strong></u></a>完后感觉也没什么的，很简单的。</p>
<p style="text-indent: 21pt">下面按我的理解简单总结一下：</p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong>一、如何理解group by</strong><strong>后</strong><strong>带rollup</strong><strong>子句所产生的效果</strong></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt">group by后带rollup子句的功能可以理解为：先按一定的规则产生多种分组，然后按各种分组统计数据（至于统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函数）。因此要搞懂group by后带rollup子句的用法<strong>主要是搞懂它是如何按一定的规则产生多种分组的</strong>。<strong>另</strong><strong>group by</strong><strong>后</strong><strong>带rollup</strong><strong>子句所返回的结果集，可以理解为各个分组所产生的结果集的并集且没有去掉重复数据</strong>。下面举例说明：</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"><strong><span>1、</span></strong><strong>对比没有带rollup</strong><strong>的goup by</strong></p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 21pt">例：Group by A ,B</p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 21pt">产生的分组种数：1种；</p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 21pt">即group by A,B</p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 21pt">返回结果集：也就是这一种分组的结果集。</p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 21pt"></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"><strong><span>2、</span></strong><strong>带rollup</strong><strong>但group by</strong><strong>与rollup</strong><strong>之间没有任何内容</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例1</strong><strong>：Group by rollup(A ,B)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：3种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by NULL</p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong><span style="color: blue">（说明：本没有</span><span style="color: blue">group by NULL </span></strong><strong><span style="color: blue">的写法，在这里指是为了方便说明，而采用之。含义是：没有分组，也就是所有数据做一个统计。例如聚合函数是</span><span style="color: blue">SUM</span></strong><strong><span style="color: blue">的话，那就是对所有满足条件的数据进行求和。此写法的含义下同</span><span style="color: blue">)</span></strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上三种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例2</strong><strong>：Group by rollup(A ,B,C)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：4种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,B,C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by A,B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第四种：group by NULL</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上四种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"><strong><span>3、</span></strong><strong>带rollup</strong><strong>但group by</strong><strong>与rollup</strong><strong>之间还包含有列信息</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例1</strong><strong>：Group by A , rollup(A ,B)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：3种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,A,B<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>等价于group by A,B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by A,A<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>等价于group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by A,NULL<span>&nbsp;&nbsp;</span>等价于group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上三种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例2</strong><strong>：Group by C , rollup(A ,B)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：3种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by C,A,B<span>&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by C,A<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by C,NULL<span>&nbsp;&nbsp;</span>等价于group by C</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上三种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"><strong><span>4、</span></strong><strong>带rollup</strong><strong>且rollup</strong><strong>子句括号内又使用括号对列进行组合</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例1</strong><strong>：Group by rollup((A ,B))</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：2种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by NULL</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上两种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例2</strong><strong>：Group by rollup(A ,(B,C))</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：3种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,B,C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by NULL</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上三种分组统计结果集的并集且未去掉重复数据。</p>
<p style="text-indent: -36.75pt; margin: 0cm 0cm 0pt 57.75pt"><span>&nbsp;&nbsp;</span><strong><span style="color: blue">注：对这种情况，可以理解为几个列被括号括在一起时，就只能被看成一个整体，分组时不需要再细化。因此也可推断</span><span style="color: blue">rollup</span></strong><strong><span style="color: blue">括号内也顶多加到一重括号，加多重了应该没有任何意义（这个推断我没有做验证的哦）。</span></strong></p>
<p style="text-indent: -36.9pt; margin: 0cm 0cm 0pt 57.9pt"></p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong>二、与rollup</strong><strong>组合使用的其它几个辅助函数</strong></p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt"><strong>1</strong><strong>、grouping()</strong><strong>函数</strong></p>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 58.5pt"><span>&nbsp;&nbsp;</span>必须接受一列且只能接受一列做为其参数。参数列值为空返回1，参数列值非空返回0。</p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt"><strong>2</strong><strong>、grouping_id()</strong><strong>函数</strong></p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt"><span>&nbsp;&nbsp;</span>必须接受一列或多列做为其参数。</p>
<p style="text-indent: 0.75pt; margin: 0cm 0cm 0pt 57.75pt">返回值为按参数排列顺序，依次对各个参数使用grouping()函数，并将结果值依次串成一串二进制数然后再转化为十进制所得到的值。</p>
<p style="text-indent: 0.75pt; margin: 0cm 0cm 0pt 57.75pt">例如：grouping(A) = 0 ; grouping(B) = 1;</p>
<p style="text-indent: 0.75pt; margin: 0cm 0cm 0pt 57.75pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>则：grouping_id(A,B) = (01)2 = 1;</p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong>grouping_id(B,A) = (10)2 =2;</p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt"><strong>3</strong><strong>、group_id()</strong><strong>函数</strong></p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt"><span>&nbsp;&nbsp;</span>调用时不需要且不能传入任何参数。</p>
<p style="text-indent: 0.75pt; margin: 0cm 0cm 0pt 57.75pt">返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。重复次数从0开始，例如某个分组第一次出现则返回值为0，第二次出现时返回值为1，&#8230;&#8230;，第n次出现返回值为n-1。</p>
<p style="text-indent: -62pt; margin: 0cm 0cm 0pt 62pt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><strong><span style="color: blue">注：使用以上三个函数往往是为了过滤掉一部分统计数据，而达到美化统计结果的作用。</span></strong></p>
<p style="text-indent: -62pt; margin: 0cm 0cm 0pt 62pt"></p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong>三、group by</strong><strong>后带rollup</strong><strong>子句</strong><strong>与group by</strong><strong>后带cube</strong><strong>子句区别</strong></p>
<p style="text-indent: 21.75pt; margin: 0cm 0cm 0pt 21pt">group by后带rollup子句与group by后带cube子句的唯一区别就是：</p>
<p style="text-indent: 0.75pt; margin: 0cm 0cm 0pt 42pt">带cube子句的group by会产生更多的分组统计数据。cube后的列有多少种组合（注意组合是与顺序无关的）就会有多少种分组。</p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例：Group by cube(A ,B,C)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：8种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A,B,C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by A,B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by A,C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第四种：group by B,C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第五种：group by C</p>
<p style="margin: 0cm 0cm 0pt 39pt">第六种：group by B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第七种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第八种：group by NULL</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上八种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong>四、group by</strong><strong>后带grouping sets</strong><strong>子句</strong></p>
<p style="text-indent: -20.65pt; margin: 0cm 0cm 0pt 41.65pt"><strong><span>&nbsp;&nbsp;&nbsp;</span></strong>group by后带grouping sets子句效果就是只返回小记记录，即只返回按单个列分组后的统计数据，不返回多个列组合分组的统计数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例1</strong><strong>：Group by grouping sets(A )</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：1种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：即为以上一种分组的统计结果集。</p>
<p style="text-indent: -20.6pt; margin: 0cm 0cm 0pt 41.6pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例2</strong><strong>：Group by grouping sets(A ,B)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：2种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by B</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上两种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"><strong>例3</strong><strong>：Group by grouping sets (A ,B,C)</strong></p>
<p style="margin: 0cm 0cm 0pt 39pt">产生的分组种数：3种；</p>
<p style="margin: 0cm 0cm 0pt 39pt">第一种：group by A</p>
<p style="margin: 0cm 0cm 0pt 39pt">第二种：group by B</p>
<p style="margin: 0cm 0cm 0pt 39pt">第三种：group by C</p>
<p style="margin: 0cm 0cm 0pt 39pt">返回结果集：为以上三种分组统计结果集的并集且未去掉重复数据。</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt">select t.city_name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decode(t.directline_type,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '总数',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directline_type,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directline_type),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum(t.amount)<br />from tmp_dl_info t<br />group by rollup(t.city_name, t.directline_type)</p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"></p>
<p style="margin: 0cm 0cm 0pt 39pt"></p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/370728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-02-24 22:05 <a href="http://www.blogjava.net/liuyz2006/articles/370728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PLSQL Developer 的自动登录</title><link>http://www.blogjava.net/liuyz2006/articles/368555.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 15 Jan 2012 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/368555.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/368555.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/368555.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/368555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/368555.html</trackback:ping><description><![CDATA[<h2>PLSQL Developer 的自动登录</h2>
<div class="content">
<p>在桌面上建立plsqldev的快捷方式，然后点击右键，打开属性对话框，在目标后的文本框中输入：<br />&#8220;D:\Program Files\PLSQL Developer\plsqldev.exe&#8221;<br />userid=username/password@dbname<br />上面的两行不要换行，就可以直接登录到dbname的oracle数据库</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/368555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-01-15 15:47 <a href="http://www.blogjava.net/liuyz2006/articles/368555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>