﻿<?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-Mark's Java Blog-随笔分类-Oracle</title><link>http://www.blogjava.net/mark1207/category/27903.html</link><description>MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA</description><language>zh-cn</language><lastBuildDate>Sun, 13 Apr 2008 01:19:24 GMT</lastBuildDate><pubDate>Sun, 13 Apr 2008 01:19:24 GMT</pubDate><ttl>60</ttl><item><title>【转】ORACLE to_char函数详解</title><link>http://www.blogjava.net/mark1207/archive/2008/04/11/192096.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 11 Apr 2008 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/11/192096.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/192096.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/11/192096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/192096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/192096.html</trackback:ping><description><![CDATA[The following are number examples for the <strong>to_char</strong> function.
<blockquote>
<table cellspacing="0" cellpadding="3" width="432" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="207"><font size="2">to_char(1210.73, '9999.9')</font></td>
            <td class="function_desc"><font size="2">would return '1210.7'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(1210.73, '9,999.99')</font></td>
            <td class="function_desc"><font size="2">would return '1,210.73'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(1210.73, '$9,999.00')</font></td>
            <td class="function_desc"><font size="2">would return '$1,210.73'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(21, '000099')</font></td>
            <td class="function_desc"><font size="2">would return '000021'</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>&nbsp;</p>
<p>The following is a list of valid parameters when the <strong>to_char</strong> function is used to convert a date to a string. These parameters can be used in many combinations.</p>
<blockquote>&nbsp;
<table class="parm_values" style="width: 524px; height: 713px" cellspacing="0" cellpadding="3" width="524" border="1">
    <tbody>
        <tr class="th_left_top">
            <th width="93"><font size="2">Parameter</font></th>
            <th><font size="2">Explanation</font></th>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">YEAR</font></td>
            <td><font size="2">Year, spelled out</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">YYYY</font></td>
            <td><font size="2">4-digit year</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">YYY<br />
            YY<br />
            Y</font></td>
            <td><font size="2">Last 3, 2, or 1 digit(s) of year.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">IYY<br />
            IY<br />
            I</font></td>
            <td><font size="2">Last 3, 2, or 1 digit(s) of ISO year.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">IYYY</font></td>
            <td><font size="2">4-digit year based on the ISO standard</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">Q</font></td>
            <td><font size="2">Quarter of year (1, 2, 3, 4; JAN-MAR = 1).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">MM</font></td>
            <td><font size="2">Month (01-12; JAN = 01).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">MON</font></td>
            <td><font size="2">Abbreviated name of month.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">MONTH</font></td>
            <td><font size="2">Name of month, padded with blanks to length of 9 characters.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">RM</font></td>
            <td><font size="2">Roman numeral month (I-XII; JAN = I).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">WW</font></td>
            <td><font size="2">Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">W</font></td>
            <td><font size="2">Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">IW</font></td>
            <td><font size="2">Week of year (1-52 or 1-53) based on the ISO standard.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">D</font></td>
            <td><font size="2">Day of week (1-7).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">DAY</font></td>
            <td><font size="2">Name of day.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">DD</font></td>
            <td><font size="2">Day of month (1-31).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">DDD</font></td>
            <td><font size="2">Day of year (1-366).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">DY</font></td>
            <td><font size="2">Abbreviated name of day.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">J</font></td>
            <td><font size="2">Julian day; the number of days since January 1, 4712 BC.</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">HH</font></td>
            <td><font size="2">Hour of day (1-12).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">HH12</font></td>
            <td><font size="2">Hour of day (1-12).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">HH24</font></td>
            <td><font size="2">Hour of day (0-23).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">MI</font></td>
            <td><font size="2">Minute (0-59).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">SS</font></td>
            <td><font size="2">Second (0-59).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">SSSSS</font></td>
            <td><font size="2">Seconds past midnight (0-86399).</font></td>
        </tr>
        <tr class="tr_left_top">
            <td><font size="2">FF</font></td>
            <td><font size="2">Fractional seconds.</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><br />
</p>
<p>The following are date examples for the <strong>to_char</strong> function.</p>
<blockquote>
<table cellspacing="0" cellpadding="3" width="460" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="253"><font size="2">to_char(sysdate, 'yyyy/mm/dd');</font></td>
            <td class="function_desc"><font size="2">would return '2003/07/09'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'Month DD, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'July 09, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'FMMonth DD, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'July 9, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'MON DDth, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'JUL 09TH, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'FMMON DDth, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'JUL 9TH, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'FMMon ddth, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'Jul 9th, 2003'</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><br />
</p>
<p>You will notice that in some examples, the <em>format_mask</em> parameter begins with "FM". This means that zeros and blanks are suppressed. This can be seen in the examples below.</p>
<blockquote>
<table cellspacing="0" cellpadding="3" width="460" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="253"><font size="2">to_char(sysdate, 'FMMonth DD, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'July 9, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'FMMON DDth, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'JUL 9TH, 2003'</font></td>
        </tr>
        <tr>
            <td class="function_example"><font size="2">to_char(sysdate, 'FMMon ddth, YYYY');</font></td>
            <td class="function_desc"><font size="2">would return 'Jul 9th, 2003'</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>The zeros have been suppressed so that the day component shows as "9" as opposed to "09".</p>
<br />
<p id="TBPingURL"><br />
<br />
<br />
<strong>Oracle函数to_char转化数字型指定小数点位数的用法</strong><br />
</p>
<p>to_char，函数功能，就是将数值型或者日期型转化为字符型。</p>
<p>比如最简单的应用：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*1.0123---&gt;'1.0123'*/</span> <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(1.0123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*123---&gt;'123'*/</span> <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;接下来再看看下面：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*0.123&nbsp;---&gt;&nbsp;'.123'&nbsp;*/</span> <br />
SELEC&nbsp;<span style="color: #0000ff">TO_CHAR</span>(0.123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;上面的结果 '.123' 在大多数情况下都不是我们想要的结果，我们想要的应该是 '0.123'。</p>
<p>我们来看一下to_char函数的具体用法：</p>
<pre>TO_CHAR ( n [, fmt [, 'nlsparam']] )
</pre>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid">该函数将NUMBER类型的n按数值格式fmt转换成VARCHAR2类型的值。<span style="color: #ff00ff">'nlsparams'</span>指定由数值格式的元素返回的字符,包括: <br />
<br />
．小数点字符 <br />
<br />
．组分隔符 <br />
<br />
．本地钱币符号 <br />
<br />
．国际钱币符号 <br />
<br />
变元的形式为： <br />
<br />
<span style="color: #ff00ff">'NLS_NUMERIC_CHARACTERS="dg"&nbsp;NLS_CURRENCY="tcxt"&nbsp;NLS_ISO_CURRENCY=territory'</span> <br />
<br />
其中d为小数点字符,g为组分隔符。 <br />
<br />
例&nbsp;:TO_CHAR&nbsp;(17145,<span style="color: #ff00ff">'L099G999'</span>,<span style="color: #ff00ff">'NLS_NUMERIC_CHARACTERS=".,"&nbsp;NLS_CURRENCY="NUD"'</span>)=NUD017,145</div>
<p>通过上面的了解，再查看fmt的一些格式，我们可以用以下表达式得到'0.123'的值：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*0.123&nbsp;---&gt;&nbsp;'&nbsp;0.123'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(0.123,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*100.12&nbsp;---&gt;&nbsp;'######'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(100.12,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*1.12&nbsp;---&gt;&nbsp;'&nbsp;1.120'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(1.12,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;' 0.123'是出来了，可是前面又多了一个空格。</p>
<p>对于 100.12 的值却是######，以及'1.12'的值变成了 '1.120'。</p>
<p>我们重新确定一个新的需求：</p>
<p>1、去空格</p>
<p>2、小数点最多4位，最少保留2位。</p>
<p>&nbsp;&nbsp;&nbsp; 1---&gt;'1.00'；1.1---&gt;'1.00'；1.12--&gt;'1.12'；1.1234---&gt;'1.1234'；</p>
<p>&nbsp;&nbsp;&nbsp; 1.12345---&gt;'1.1235'</p>
<p>最终实现如下：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/* <br />
&nbsp;&nbsp;FM&nbsp;：除空格&nbsp;&nbsp; <br />
&nbsp;&nbsp;9999999.0099：允许小数点左边最大正数为7位，小数点右边最少2位，最多4位，且在第5位进行四舍五入 <br />
*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(123.0233,<span style="color: #ff00ff">'FM9999999.0099'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p id="TBPingURL">&nbsp;</p>
<div id="AjaxHolder_UpdatePanel1">
<div id="comments">
<p><span>PLSQL小经验<br />
一、 Oracle的to_char()函数功能很强大但是在用它格式化数值型数据时应该请注意以下几项。如果是小数如：0.23这样的数据经过to_char后再<strong onmouseover='isShowAds = true;isShowAds2 = true;ads.Move(this,"http://rad.17luntan.com/UploadImage/17/633111011619218750.gif","LG%u9510%u6BD4%u6DB2%u6676%u5BF9%u6BD4%u5EA63000%3A1%2C%u8D85%u8D8A%u60F3%u8C61%2C%u9510%u4E0D%u53EF%u5F53","42887","显示","%u663E%u793A%20","http%3A//210.192.100.35/11779028996160http%3A//www.lgemonitor.com.cn/mnt/index.html%3F11779028996160", event)' style="font-weight: normal; cursor: hand; color: #0000ff; border-bottom: blue 1px dotted; text-decoration: underline" onclick='javascript:window.open("http://s0.17luntan.com/ClickPortal/WebClick.aspx?id=42887&amp;k=%u663E%u793A&amp;siteid=95d6d193-1fb9-4fc0-8708-b7ceb3276924&amp;url=http%3A//wisebo.bokee.com/viewdiary.15801227.html&amp;gourl=http%3A//210.192.100.35/11779028996160http%3A//www.lgemonitor.com.cn/mnt/index.html%3F11779028996160&amp;parm=5EC5769AEEBFF8D9636BE5DF51E3BC132B5315D174A593F6&amp;alliedsiteid=148");' onmouseout="isShowAds = false;isShowAds2 = false">显示</strong>会变为.23，如果你为了让它显示出原来的0.23的话就得用To_char(要格式化的数值,&#8217;0.999&#8217;)保留三个小数，并显示但这里就要注意了。他为你截取小数的时候是四舍五入了。所以如果是要求截掉小数而不四舍五入的话就应该自己写个函数截下去后再规格化。以保证它不四舍五入。 </span><br />
<br />
二、 To_char(1.9999,&#8217;FM90.0999&#8217;)这个函数规格化时90.0999的含义是有9的地方如果有数字就显示如果没有数字就不显示，有0的地方在没有数字的时候也会有０来占位.但这样做也有一个很大的缺点,就是如果是整数时它也仍然会显示&#8221;.&#8221;,不要小瞧这个点,一般来讲页面上要显示的话这个点就是多余的.也给我们造成了不小的麻烦.还要自己再写函数来把这个小点搞定. <br />
<br />
三、 对于日期型的Oracle倒时提供了一个好的处理方法,可以把日期做成数值型的.然后再To_char就能显示出你所需要的类型了. <br />
<br />
四、 在使用select into时一定要注意,这种方法你一定要确认肯定会有数据被查出时才能使用.如果查询结果为空时会导致报错.还有一种情况是查出来的数据是多条也会报错.所以应该尽量便宜游标来做.会减少错误产生的机率. <br />
<br />
五、 还有注意一点rownum不支持排序,就是说你想用这个来控制行数的话就会发现他没有按你指定的排序方式显示.,这是一个很难办的事.而且如果你用rownum=2这样的语句来输出第二行的话也是行不通的. 六、 最恶心的一点是Oracle对null的判断变态到极点.如果你说某个变量 aa=null它是判断不出来的.尽管aa的确是空.即使在选择条件里也是判断不出来的.不知道为什么,只好用nvl()这个函数来判断了.在条件之外可以用 aa is null 来判断. </p>
<p><span>六 补充一点.就是在写存储过程时要注意参数名不能与<strong onmouseover='isShowAds = true;isShowAds2 = true;ads.Move(this,"","%u6700%u5F3A%u7684%u6570%u636E%u5E93%uFF01%u6765%u81EA%u5FAE%u8F6F","20656","数据库","%u6570%u636E%u5E93","http%3A//go.microsoft.com/%3Flinkid%3D6331217", event)' style="font-weight: normal; cursor: hand; color: #0000ff; border-bottom: blue 1px dotted; text-decoration: underline" onclick='javascript:window.open("http://s0.17luntan.com/ClickPortal/WebClick.aspx?id=20656&amp;k=%u6570%u636E%u5E93&amp;siteid=95d6d193-1fb9-4fc0-8708-b7ceb3276924&amp;url=http%3A//wisebo.bokee.com/viewdiary.15801227.html&amp;gourl=http%3A//go.microsoft.com/%3Flinkid%3D6331217&amp;parm=5EC5769AEEBFF8D9636BE5DF51E3BC132B5315D174A593F6&amp;alliedsiteid=148");' onmouseout="isShowAds = false;isShowAds2 = false">数据库</strong>字段名相同.否则Oracle会把这个参数名看成是字段名的,即使你用表的别名区分也不行.所以起参数名的时候一定要注意这点了.</span></p>
</div>
</div>
<img src ="http://www.blogjava.net/mark1207/aggbug/192096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-11 10:47 <a href="http://www.blogjava.net/mark1207/archive/2008/04/11/192096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>decode()函数使用技巧</title><link>http://www.blogjava.net/mark1207/archive/2008/04/11/192092.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 11 Apr 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/11/192092.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/192092.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/11/192092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/192092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/192092.html</trackback:ping><description><![CDATA[<p><br />
&#183;软件环境： <br />
1、Windows NT4.0+ORACLE 8.0.4<br />
2、ORACLE安装路径为：C:/ORANT<br />
&#183;含义解释： <br />
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)</p>
<p>该函数的含义如下：<br />
IF 条件=值1 THEN<br />
　　　　RETURN(翻译值1)<br />
ELSIF 条件=值2 THEN<br />
　　　　RETURN(翻译值2)<br />
　　　　......<br />
ELSIF 条件=值n THEN<br />
　　　　RETURN(翻译值n)</p>
<p>ELSE<br />
　　　　RETURN(缺省值)<br />
END IF<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用方法： <br />
1、比较大小<br />
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值<br />
sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1</p>
<p>例如：<br />
变量1=10，变量2=20<br />
则sign(变量1-变量2)返回-1，decode解码结果为&#8220;变量1&#8221;，达到了取较小值的目的。</p>
<p><br />
2、表、视图结构转化<br />
现有一个商品销售表sale，表结构为：<br />
month　　　 char(6)　　　　　 --月份<br />
sell　　　　number(10,2)　　　--月销售金额</p>
<p>现有数据为：<br />
200001　　1000<br />
200002　　1100<br />
200003　　1200<br />
200004　　1300<br />
200005　　1400<br />
200006　　1500<br />
200007　　1600<br />
200101　　1100<br />
200202　　1200<br />
200301　　1300</p>
<p>想要转化为以下结构的数据：<br />
year　　　char(4)　　　　　 --年份<br />
month1　　number(10,2)　　　--1月销售金额<br />
month2　　number(10,2)　　　--2月销售金额<br />
month3　　number(10,2)　　　--3月销售金额<br />
month4　　number(10,2)　　　--4月销售金额<br />
month5　　number(10,2)　　　--5月销售金额<br />
month6　　number(10,2)　　　--6月销售金额<br />
month7　　number(10,2)　　　--7月销售金额<br />
month8　　number(10,2)　　　--8月销售金额<br />
month9　　number(10,2)　　　--9月销售金额<br />
month10　　number(10,2)　　　--10月销售金额<br />
month11　　number(10,2)　　　--11月销售金额<br />
month12　　number(10,2)　　　--12月销售金额</p>
<p>结构转化的SQL语句为：<br />
create or replace view<br />
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)<br />
as<br />
　　　　select <br />
　　　　substrb(month,1,4),<br />
　　　　sum(decode(substrb(month,5,2),'01',sell,0)),<br />
　　　　sum(decode(substrb(month,5,2),'02',sell,0)),<br />
　　　　sum(decode(substrb(month,5,2),'03',sell,0)),<br />
　　　　sum(decode(substrb(month,5,2),'04',sell,0)),</p>
<p><br />
该文章转载自宋氏电脑 技术无忧：http://www.pc51.net/data/ORACLE/2007-01-12/4692.html</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/192092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-11 10:42 <a href="http://www.blogjava.net/mark1207/archive/2008/04/11/192092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle用Start with...Connect By子句递归查询</title><link>http://www.blogjava.net/mark1207/archive/2008/04/11/192084.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 11 Apr 2008 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/11/192084.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/192084.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/11/192084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/192084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/192084.html</trackback:ping><description><![CDATA[<p>Oracle用Start with...Connect By子句递归查询</p>
<p><br />
Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。<br />
创建示例表：<br />
CREATE TABLE TBL_TEST<br />
(<br />
&nbsp; ID&nbsp;&nbsp;&nbsp; NUMBER,<br />
&nbsp; NAME&nbsp; VARCHAR2(100 BYTE),<br />
&nbsp; PID&nbsp;&nbsp; NUMBER&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT 0<br />
);<br />
&nbsp;<br />
插入测试数据：<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');<br />
&nbsp;<br />
从Root往树末梢递归<br />
select * from TBL_TEST<br />
&nbsp;start with id=1<br />
&nbsp;connect by prior id = pid<br />
&nbsp;<br />
从末梢往树ROOT递归<br />
select * from TBL_TEST<br />
&nbsp;start with id=5<br />
&nbsp;connect by prior pid = id<br />
</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/192084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-11 10:28 <a href="http://www.blogjava.net/mark1207/archive/2008/04/11/192084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle函数列表速查</title><link>http://www.blogjava.net/mark1207/archive/2008/04/11/192082.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 11 Apr 2008 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/11/192082.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/192082.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/11/192082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/192082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/192082.html</trackback:ping><description><![CDATA[<p>Oracle函数列表速查</p>
<p>PL/SQL单行函数和组函数详解<br />
　函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类： <br />
　　 单行函数</p>
<p>　　 组函数 </p>
<p>　　本文将讨论如何利用单行函数以及使用规则。</p>
<p>　　SQL中的单行函数</p>
<p>　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。<br />
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)</p>
<p>　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
<p>　　NULL和单行函数</p>
<p>　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</p>
<p>　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿<br />
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2</p>
<p>　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：<br />
update empset salary=(salary+bonus)*1.1</p>
<p>　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。<br />
所以正确的语句是：<br />
update empset salary=(salary+nvl(bonus,0)*1.1<br />
单行字符串函数</p>
<p>　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串</p>
<p>　　ASCII()<br />
　　c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()<br />
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122</p>
<p>　　CHR(＜i＞)[NCHAR_CS]<br />
　　i是一个数字，函数返回十进制表示的字符<br />
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B</p>
<p>　　CONCAT(,)<br />
　　c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同<br />
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda</p>
<p>　　INITCAP()<br />
　　c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。<br />
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici</p>
<p>　　INSTR(,[,＜i＞[,]])<br />
　　c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.<br />
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2</p>
<p>　　INSTRB(,[,i[,j])<br />
　　与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()</p>
<p>　　LENGTH()<br />
　　c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。<br />
select LENGTH('Ipso Facto') ergo from dualergo10</p>
<p>　　LENGTHb()<br />
　　与LENGTH()一样，返回字节。</p>
<p>　　lower()<br />
　　返回c的小写字符，经常出现在where子串中<br />
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite</p>
<p>　　LPAD(,＜i＞[,])<br />
　　c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。<br />
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe</p>
<p>　　LTRIM(,)<br />
　　把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。<br />
select LTRIM('Mississippi','Mis') from dualLTRppi</p>
<p>　　RPAD(,＜i＞[,]) <br />
　　在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似</p>
<p>　　RTRIM(,)<br />
　　把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>　　REPLACE(,[,])<br />
　　c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。<br />
select REPLACE('uptown','up','down') from dualREPLACEdowntown</p>
<p>　　STBSTR(,＜i＞[,])<br />
　　c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。<br />
select SUBSTR('Message',1,4) from dualSUBSMess</p>
<p>　　SUBSTRB(,＜i＞[,])<br />
　　与SUBSTR大致相同，只是I,J是以字节计算。</p>
<p>　　SOUNDEX()<br />
　　返回与c1发音相似的词<br />
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250</p>
<p>　　TRANSLATE(,,)<br />
　　将c1中与c2相同的字符以c3代替<br />
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble </p>
<p>　　TRIM([[]] from c3)<br />
　　将c3串中的第一个，最后一个，或者都删除。<br />
select TRIM(' space padded ') trim from dual TRIMspace padded</p>
<p>　　UPPER()<br />
　　返回c1的大写，常出现where子串中<br />
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING<br />
单行数字函数</p>
<p>　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作<br />
数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
<p>　　ABS()<br />
　　返回n的绝对值</p>
<p>　　ACOS()<br />
　　反余玄函数，返回-1到1之间的数。n表示弧度<br />
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </p>
<p>　　ASIN()<br />
　　反正玄函数，返回-1到1，n表示弧度</p>
<p>　　ATAN()<br />
　　反正切函数，返回n的反正切值，n表示弧度。</p>
<p>　　CEIL()<br />
　　返回大于或等于n的最小整数。</p>
<p>　　COS()<br />
　　返回n的余玄值，n为弧度</p>
<p>　　COSH()<br />
　　返回n的双曲余玄值，n 为数字。<br />
select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847</p>
<p>　　EXP()<br />
　　返回e的n次幂，e=2.71828183.</p>
<p>　　FLOOR()<br />
　　返回小于等于N的最大整数。</p>
<p>　　LN()<br />
　　返回N的自然对数，N必须大于0</p>
<p>　　LOG(,)<br />
　　返回以n1为底n2的对数</p>
<p>　　MOD()<br />
　　返回n1除以n2的余数，</p>
<p>　　POWER(,)<br />
　　返回n1的n2次方</p>
<p>　　ROUND(,)<br />
　　返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。<br />
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54</p>
<p>　　SIGN()<br />
　　如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.</p>
<p>　　SIN（)<br />
　　返回n的正玄值,n为弧度。</p>
<p>　　SINH()<br />
　　返回n的双曲正玄值,n为弧度。</p>
<p>　　SQRT()<br />
　　返回n的平方根,n为弧度</p>
<p>　　TAN（)<br />
　　返回n的正切值,n为弧度</p>
<p>　　TANH()<br />
　　返回n的双曲正切值,n为弧度</p>
<p>　　TRUNC(,)<br />
　　返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
<p>　　单行日期函数</p>
<p>　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
<p>　　ADD_MONTHS(,＜i＞)<br />
　　返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
<p>　　LAST_DAY()<br />
　　函数返回包含日期d的月份的最后一天 </p>
<p>　　MONTHS_BETWEEN(,)<br />
　　返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
<p>　　NEW_TIME(,,)<br />
　　d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
<p>　　NEXT_DAY(,)<br />
　　返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。<br />
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </p>
<p>　　ROUND([,])<br />
　　将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
<p>　　SYADATE<br />
　　函数没有参数，返回当前日期和时间。</p>
<p>　　TRUNC([,]) <br />
　　返回由fmt指定的单位的日期d.<br />
单行转换函数</p>
<p>　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
<p>　　CHARTORWID()<br />
　　c 使一个字符串，函数将c转换为RWID数据类型。<br />
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') </p>
<p>　　CONVERT(,[,])<br />
　　c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
<p>　　HEXTORAW()<br />
　　x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
<p>　　RAWTOHEX()<br />
　　x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
<p>　　ROWIDTOCHAR()<br />
　　函数将ROWID数据类型转换为CHAR数据类型。</p>
<p>　　TO_CHAR([[,)<br />
　　x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。<br />
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"</p>
<p>　　TO_DATE([,[,）<br />
　　c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
<p>　　TO_MULTI_BYTE()<br />
　　c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
<p>　　TO_NUMBER([,[,)<br />
　　c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
<p>　　TO_SINGLE_BYTE()<br />
　　将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
<p>　　其它单行函数</p>
<p>　　BFILENAME( <br />
,)<br />
　　dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
<p>　　DECODE(,,[,,,[])<br />
　　x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
<p>　　DUMP(,[,[,[,]]])<br />
　　x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
<p>　　EMPTY_BLOB()<br />
　　该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
<p>　　EMPTY_CLOB()<br />
　　该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
<p>　　GREATEST()<br />
　　exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
<p>　　LEAST()<br />
　　exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
<p>　　UID<br />
　　该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
<p>　　USER<br />
　　返回当前用户的用户名</p>
<p>　　USERENV()<br />
　　基于opt返回包含当前会话信息。opt的可选值为：</p>
<p>　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE <br />
　　SESSIONID 　返回审计会话标示符</p>
<p>　ENTRYID 　　返回可用的审计项标示符 <br />
　　INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。<br />
　　LANGUAGE　　返回语言、地域、数据库设置的字符集。<br />
　　LANG　　　　返回语言名称的ISO缩写。<br />
　　TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。</p>
<p>　　VSIZE()<br />
　　x是一个表达式。返回x内部表示的字节数。<br />
SQL中的组函数</p>
<p>　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
<p>　　组（多行）函数</p>
<p>　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
<p>　　AVG([{DISYINCT|ALL}])<br />
　　返回数值的平均值。缺省设置为ALL.<br />
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413</p>
<p>　　COUNT({*|DISTINCT|ALL} )<br />
　　返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
<p>　　MAX([{DISTINCT|ALL}])<br />
　　返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
<p>　　MIN([{DISTINCT|ALL}])<br />
　　返回选择列表项目的最小值。</p>
<p>　　STDDEV([{DISTINCT|ALL}])<br />
　　返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
<p>　　SUM([{DISTINCT|ALL}])<br />
　　返回选择列表项目的数值的总和。</p>
<p>　　VARIANCE([{DISTINCT|ALL}])<br />
　　返回选择列表项目的统计方差。</p>
<p>　　用GROUP BY给数据分组</p>
<p>　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。<br />
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982</p>
<p>　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。<br />
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982</p>
<p>　　用HAVING子句限制分组数据</p>
<p>　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：<br />
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
<p>　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：<br />
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;</p>
<p>　　嵌套函数</p>
<p>　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。<br />
</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/192082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-11 10:26 <a href="http://www.blogjava.net/mark1207/archive/2008/04/11/192082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>