doc-exports/docs/dli/sqlreference/dli_08_0164.html
Su, Xiaomeng 04d4597cf3 dli_sqlreference_0511_version
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com>
Co-authored-by: Su, Xiaomeng <suxiaomeng1@huawei.com>
Co-committed-by: Su, Xiaomeng <suxiaomeng1@huawei.com>
2023-11-02 14:34:08 +00:00

79 lines
12 KiB
HTML

<a name="dli_08_0164"></a><a name="dli_08_0164"></a>
<h1 class="topictitle1">GROUPING SETS</h1>
<div id="body8662426"><div class="section" id="dli_08_0164__en-us_topic_0093946935_s99240b54cda24c49887105420923162e"><h4 class="sectiontitle">Function</h4><p id="dli_08_0164__en-us_topic_0093946935_aded98fff326b465b8ef9e2c5d63947c3">This statement is used to generate the cross-table row and achieve the cross-statistics of the GROUP BY field.</p>
</div>
<div class="section" id="dli_08_0164__en-us_topic_0093946935_se24d47212e5444f99183d34574323e0c"><h4 class="sectiontitle">Syntax</h4><div class="codecoloring" codetype="Sql" id="dli_08_0164__screen461117419532"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">attr_expr_list</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">table_reference</span>
<span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">col_name_list</span>
<span class="w"> </span><span class="k">GROUPING</span><span class="w"> </span><span class="k">SETS</span><span class="p">(</span><span class="n">col_name_list</span><span class="p">);</span>
</pre></div></td></tr></table></div>
</div>
</div>
<div class="section" id="dli_08_0164__en-us_topic_0093946935_s38d20343e8fe47cfa9caf208edf8ea6a"><h4 class="sectiontitle">Keyword</h4><p id="dli_08_0164__en-us_topic_0093946935_ac7a7b1051fc44e1d85852cdc311321e8">GROUPING SETS is the expansion of GROUP BY. For example:</p>
<ul id="dli_08_0164__en-us_topic_0093946935_u240669ff910141b1b8c6c62da62f1292"><li id="dli_08_0164__li1060414103228"><em id="dli_08_0164__i16054104223"><strong id="dli_08_0164__b96051410132216">SELECT a, b, sum(expression) FROM table GROUP BY a, b GROUPING SETS((a,b));</strong></em><div class="p" id="dli_08_0164__p867516147229">It can be converted to the following query:<div class="codecoloring" codetype="Sql" id="dli_08_0164__screen1865181116546"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span>
<span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
</div>
</li><li id="dli_08_0164__li842402231"><strong id="dli_08_0164__b84220172316"><em id="dli_08_0164__i14214016235">SELECT a, b, sum(expression) FROM table GROUP BY a, b GROUPING SETS(a,b);</em></strong><p id="dli_08_0164__p1098214315232">It can be converted to the following two queries:</p>
<div class="codecoloring" codetype="Sql" id="dli_08_0164__screen68661197234"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
<span class="k">UNION</span>
<span class="k">SELECT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
</li><li id="dli_08_0164__li1238526152812"><strong id="dli_08_0164__b838514618287"><em id="dli_08_0164__i1738516615285">SELECT a, b, sum(expression) FROM table GROUP BY a, b GROUPING SETS((a,b), a);</em></strong><div class="p" id="dli_08_0164__p109097916283">It can be converted to the following two queries:<div class="codecoloring" codetype="Sql" id="dli_08_0164__screen874683682710"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="k">UNION</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
</div>
</li><li id="dli_08_0164__li15419161322819"><strong id="dli_08_0164__b34192131289"><em id="dli_08_0164__i4419413172818">SELECT a, b, sum(expression) FROM table GROUP BY a, b GROUPING SETS((a,b), a, b, ());</em></strong><div class="p" id="dli_08_0164__p1750581511285">It can be converted to the following four queries:<div class="codecoloring" codetype="Sql" id="dli_08_0164__screen1379615642714"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="k">UNION</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span>
<span class="k">UNION</span>
<span class="k">SELECT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="k">UNION</span>
<span class="k">SELECT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
</div>
</li></ul>
</div>
<div class="section" id="dli_08_0164__en-us_topic_0093946935_sbc517df122854a76b8679083d4c7eac0"><h4 class="sectiontitle">Precautions</h4><ul id="dli_08_0164__en-us_topic_0093946935_u1b1cc4215eda42ec804ab24e57da1c18"><li id="dli_08_0164__en-us_topic_0093946935_l0dddbf116aea43e9ae31265ebc7799a9">The to-be-grouped table must exist. Otherwise, an error is reported.</li><li id="dli_08_0164__en-us_topic_0093946935_lfe026f34b89a42e5a949697e85928044">Different from ROLLUP, there is only one syntax for GROUPING SETS.</li></ul>
</div>
<div class="section" id="dli_08_0164__en-us_topic_0093946935_s0f74881be1b6425e90ff5d49d9d2ca0d"><h4 class="sectiontitle">Example</h4><p id="dli_08_0164__en-us_topic_0093946935_aef9c91efc3004c6d8e23ac2dd6236b5c">To generate the cross-table row according to the <strong id="dli_08_0164__b97201361383">group_id</strong> and <strong id="dli_08_0164__b115155417816">job</strong> fields and return the total salary on each aggregation condition, run the following statement:</p>
<div class="codecoloring" codetype="Sql" id="dli_08_0164__screen879483114283"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">group_id</span><span class="p">,</span><span class="w"> </span><span class="n">job</span><span class="p">,</span><span class="w"> </span><span class="k">SUM</span><span class="p">(</span><span class="n">salary</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">group_test</span>
<span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">group_id</span><span class="p">,</span><span class="w"> </span><span class="n">job</span>
<span class="w"> </span><span class="k">GROUPING</span><span class="w"> </span><span class="k">SETS</span><span class="w"> </span><span class="p">(</span><span class="n">group_id</span><span class="p">,</span><span class="w"> </span><span class="n">job</span><span class="p">);</span>
</pre></div></td></tr></table></div>
</div>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="dli_08_0159.html">Grouping</a></div>
</div>
</div>