<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OS与Oracle &#187; group by</title>
	<atom:link href="http://www.os2ora.com/tag/group-by/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.os2ora.com</link>
	<description>专注于现实世界Oracle数据库的高性能，高可扩展性与新一代数据库Exadata架构</description>
	<lastBuildDate>Fri, 16 Jul 2010 02:55:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>如何实现组织结构中的汇总统计</title>
		<link>http://www.os2ora.com/how-to-hierarchical-summary/</link>
		<comments>http://www.os2ora.com/how-to-hierarchical-summary/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:20:32 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[connect_by_root]]></category>
		<category><![CDATA[group by]]></category>
		<category><![CDATA[Hierarchical Queries]]></category>
		<category><![CDATA[salary]]></category>
		<category><![CDATA[summary]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/how-to-hierarchical-summary/</guid>
		<description><![CDATA[汇总统计是数据处理中常见的一个操作。对于一般的数据模型来说，一般是有一个事实表，若干个维度表，通过事实表与维度表的连接，实现不同层次的查询汇总。 
问题是对于组织结构而言，一般所有的数据都存贮于一个表中，而且，组织结构的层次也是动态的。那么，在这种情况下，如何实现员工工资的汇总呢？一个比较有趣的问题是: 如何统计员工及其所有被管理员工的总工资，举个例子，CEO的总工资就是整个公司总有员工的总工资之和，包括他自己......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>汇总统计是数据处理中常见的一个操作。对于一般的数据模型来说，一般是有一个事实表，若干个维度表，通过事实表与维度表的连接，实现不同层次的查询汇总。<br />
问题是对于组织结构而言，一般所有的数据都存贮于一个表中，而且，组织结构的层次也是动态的。那么，在这种情况下，如何实现员工工资的汇总呢？一个比较有趣的问题是: 如何统计员工及其所有被管理员工的总工资，举个例子，CEO的总工资就是整个公司总有员工的总工资之和，包括他自己。</p>
<p>Oracle 引入了一个扩展的运算符，专门用来处理此种情形，它就是connect_by_root。<br />
当以connect_by_root修饰一个列名时，Oracle将返回根节点对应的此列的值。例如，当start with 为 last_name = &#8216;King&#8217;时，这时返回的所有行的connect_by_root last_name的值都将为&#8217;King&#8217;。这时，对所有行的累计就是对&#8217;King&#8217;的数据的累计了。当不指定start with 子句时，Oracle将对每个节点依次进行遍历，于是，我们可以对返回的结果对last_name进行一次group by，那么我们就得到了所有last_name对应的汇总工资了。</p>
<p>下面是Oracle 文档中的例子。<br />
The following example returns the last name of each employee in department 110, each manager above that employee in the hierarchy, the number of levels between manager and employee, and the path between the two:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> last_name <span style="color: #ff0000;">&quot;Employee&quot;</span><span style="color: #66cc66;">,</span> CONNECT_BY_ROOT last_name <span style="color: #ff0000;">&quot;Manager&quot;</span><span style="color: #66cc66;">,</span>
   LEVEL<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #ff0000;">&quot;Pathlen&quot;</span><span style="color: #66cc66;">,</span> SYS_CONNECT_BY_PATH<span style="color: #66cc66;">&#40;</span>last_name<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Path&quot;</span>
   <span style="color: #993333; font-weight: bold;">FROM</span> employees
   <span style="color: #993333; font-weight: bold;">WHERE</span> LEVEL &amp;gt; <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> department_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">110</span>
   CONNECT <span style="color: #993333; font-weight: bold;">BY</span> PRIOR employee_id <span style="color: #66cc66;">=</span> manager_id
   <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">&quot;Employee&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Manager&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Pathlen&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Path&quot;</span>;
&nbsp;
Employee        Manager            Pathlen Path
<span style="color: #808080; font-style: italic;">--------------- --------------- ---------- ------------------------------</span>
Gietz           Higgins                  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Gietz           King                     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">/</span>King<span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Gietz           Kochhar                  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Higgins         King                     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">/</span>King<span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins
Higgins         Kochhar                  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins</pre></div></div>

<p>The following example uses a GROUP BY clause to return the total salary of each employee in department 110 and all employees below that employee in the hierarchy:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> name<span style="color: #66cc66;">,</span> SUM<span style="color: #66cc66;">&#40;</span>salary<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Total_Salary&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #993333; font-weight: bold;">SELECT</span> CONNECT_BY_ROOT last_name <span style="color: #993333; font-weight: bold;">AS</span> name<span style="color: #66cc66;">,</span> Salary
      <span style="color: #993333; font-weight: bold;">FROM</span> employees
      <span style="color: #993333; font-weight: bold;">WHERE</span> department_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">110</span>
      CONNECT <span style="color: #993333; font-weight: bold;">BY</span> PRIOR employee_id <span style="color: #66cc66;">=</span> manager_id<span style="color: #66cc66;">&#41;</span>
      <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> name
   <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> name<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Total_Salary&quot;</span>;
&nbsp;
NAME                      Total_Salary
<span style="color: #808080; font-style: italic;">------------------------- ------------</span>
Gietz                             <span style="color: #cc66cc;">8300</span>
Higgins                          <span style="color: #cc66cc;">20300</span>
King                             <span style="color: #cc66cc;">20300</span>
Kochhar                          <span style="color: #cc66cc;">20300</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/how-to-hierarchical-summary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
