「SQL Server - GROUP BY」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

ページの作成:「== 概要 == <br><br> == 複数の行を各グループに集約する (GROUP BY) == 下表に示すテーブルがある。<br> <center> {| class="wikitable" |+ T_Sale…」
 
文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の1版が非表示)
6行目: 6行目:
下表に示すテーブルがある。<br>
下表に示すテーブルがある。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|+ T_Salesテーブル
|+ T_Salesテーブル
|-
|-
! Shop_ID !! Category !! Name !! Price
! style="background-color:#66CCFF;" | Shop_ID  
! style="background-color:#66CCFF;" | Category  
! style="background-color:#66CCFF;" | Name  
! style="background-color:#66CCFF;" | Price
|-
|-
| 1 || Fruit || Apple || 300
| 1 || Fruit || Apple || 300
63行目: 66行目:
下表に示すテーブルがある。<br>
下表に示すテーブルがある。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|+ T_Salesテーブル
|+ T_Salesテーブル
|-
|-
! Shop_ID !! Category !! Name !! Price
! style="background-color:#66CCFF;" | Shop_ID  
! style="background-color:#66CCFF;" | Category  
! style="background-color:#66CCFF;" | Name  
! style="background-color:#66CCFF;" | Price
|-
|-
| 1 || Fruit || Apple || 300
| 1 || Fruit || Apple || 300
99行目: 105行目:
1. まず、<code>GROUP BY</code>句で指定したCategoryカラムの単位で集約する。<br>
1. まず、<code>GROUP BY</code>句で指定したCategoryカラムの単位で集約する。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|+ Caption text
|-
|-
! Category !! AVG(Price)
! style="background-color:#66CCFF;" | Category  
! style="background-color:#66CCFF;" | AVG(Price)
|-
|-
| Fruit || 250
| Fruit || 250
112行目: 118行目:
2. 次に、AVG(Price)のカラムに対して、HAVING句で指定した条件(200より大きい)を満たすレコードが表示される。<br>
2. 次に、AVG(Price)のカラムに対して、HAVING句で指定した条件(200より大きい)を満たすレコードが表示される。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|+ Caption text
|-
|-
! Category !! AVG(Price)
! style="background-color:#66CCFF;" | Category  
! style="background-color:#66CCFF;" | AVG(Price)
|-
|-
| Fruit || 250
| Fruit || 250
147行目: 153行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:SQL_Server]]
[[カテゴリ:SQL_Server]]

2024年11月10日 (日) 16:00時点における最新版

概要



複数の行を各グループに集約する (GROUP BY)

下表に示すテーブルがある。

T_Salesテーブル
Shop_ID Category Name Price
1 Fruit Apple 300
1 Fruit Orange 200
1 Vegetable Carrot 200
2 Vegetable Eggplant 100


以下に、GROUP BY句のシンタックスを示す。

GROUP BY句で指定したカラム名で、複数の行を集約する。
SELECT句のカラム名とGROUP BY句のカラム名は一致している必要はない。

 SELECT <カラム名> FROM <テーブル名> 
 GROUP BY <カラム名>


以下の例では、上記のT_Salesテーブルに対して、GROUP BY句を使用してデータを抽出している。

 SELECT Category, AVG(Price) 
 FROM T_Sales
 GROUP BY Category;


結果は、以下の通りである。

GROUP BY句で指定したCategoryカラムの値で集約されたレコードが表示される。
また、各レコードごとに集約関数の値が表示される。

Category     AVG(Price)
Fruit        250
Vegetable    150


以下の例では、GROUP BY句にShop_IDカラムとCategoryカラムを追加する時、Shop_IDカラムとCategoryカラムでレコードが集約されている。

 SELECT Shop_ID, Category, AVG(Price)
 FROM T_Sales
 GROUP BY Shop_ID, Category
 ORDER BY Shop_ID, Category;


Shop_ID     Category     AVG(Price)
1           Fruit        250
1           Vegetable    200
2           Vegetable    100



集約関数の値に条件を指定する (HAVING句)

HAVING句の使用

下表に示すテーブルがある。

T_Salesテーブル
Shop_ID Category Name Price
1 Fruit Apple 300
1 Fruit Orange 200
1 Vegetable Carrot 200
2 Vegetable Eggplant 100


以下に、HAVING句のシンタックスを示す。

HAVING句を使用すると、複数のレコードを各グループに集約して、集約関数の値に条件を指定できる。

 SELECT <カラム名>
 FROM <テーブル名>
 GROUP BY <カラム名>
 HAVING <条件>


以下の例では、上記のT_Salesテーブルに対して、HAVING句を使用してデータを抽出している。

 SELECT Category, AVG(Price) 
 FROM T_sales
 GROUP BY Category 
 HAVING AVG(Price) > 200;


以下に、上記のSQL文の処理のイメージを示す。
1. まず、GROUP BY句で指定したCategoryカラムの単位で集約する。

Category AVG(Price)
Fruit 250
Vegetable 150


2. 次に、AVG(Price)のカラムに対して、HAVING句で指定した条件(200より大きい)を満たすレコードが表示される。

Category AVG(Price)
Fruit 250


WHERE句が使用できない場合

以下のように、WHERE句で、集約関数(AVG)の結果を条件にすることはできない。

MySQLでは、以下のメッセージが表示される。

#1111 - 集計関数の使用方法が不正です。


集約関数の結果を条件にする場合は、HAVING句を使用する。

 SELECT Category, AVG(Price) 
 FROM T_Sales 
 WHERE AVG(Price) > 200
 GROUP BY Category;


WHERE句が使用できるパターン

ただし、集約関数の結果以外を条件にする場合は、GROUP BY句とWHERE句が使用できる。

この場合、レコード件数を絞るWHERE句を使用した方がよい。
HAVING句では処理が遅くなる可能性がある。

 SELECT Category, AVG(Price) 
 FROM T_Sales
 WHERE Name = 'Apple'
 GROUP BY Category;