SQL Server

SQL Server ポケモンのデータで学ぶSQL GROUP BY句を使ってグループ化してみよう。この列は集計関数または GROUP BY 句に含まれていません。の解決方法

今回のテーマ

こんにちは、かっぱちゃんです。

今回は下記の記事の続きです。前回はORDER BY句について学んだので、今回はGROUP BY句の基本的な使い方について学んでいきます!

こちらもCHECK

SQL Server ポケモンのデータで学ぶSQL ORDER BY句を使ってみよう。ポケモンを速い順に並べる方法。

今回のテーマContents1 今回のテーマ2 GROUP BY句の使い方3 GROUP BY句で複数項目を指定する。4 まとめ こんにちは、かっぱちゃんです。 今回は下記の記事の続きです。一通りWH ...

続きを見る

ポケモンデータのダウンロードは下記の記事からお願いします。

こちらもCHECK

SQL Server ポケモンのデータで学ぶSQL データの準備編

今回のテーマContents1 今回のテーマ2 ポケモンデータのダウンロード3 Sql Server Management Studioでの設定4 ポケモンデータのテーブルについて5 各テーブルの属性 ...

続きを見る

データベースを使用するにあたって、GROUPBY句はかなり使う場面が多いので、基礎的なことはここで覚えてくださいね!!

それでは、早速やっていきましょう!

KappaChan
色々な条件で抽出したいかっぱ!

GROUP BY句の使い方

かっぱちゃんが早速下記のように悩んでいます。

KappaChan
すばやさが100以上のポケモンをタイプ1ごとに出力したいかっぱ!

今回はタイプ1ごとに並べたいみたいです。

今回のタイプのように、グループ化をして出力したい場合は、GROUP BY句を使用しましょう。

早速クエリをみてみます。

 出力結果
タイプ1 ポケモン名
あく ニューラ
いわ プテラ
エスパー エーフィ
エスパー セレビィ
エスパー フーディン
エスパー ミュウ
エスパー ミュウツー
エスパー ユンゲラー
エスパー ルギア
くさ ワタッコ
ゴースト ゲンガー
じめん ダグトリオ
でんき エレブー
でんき サンダー
でんき サンダース
でんき ビリリダマ
でんき マルマイン
でんき ライコウ
でんき ライチュウ
どく クロバット
ノーマル オニドリル
ノーマル ケンタロス
ノーマル ドードリオ
ノーマル ピジョット
ノーマル ペルシアン
ノーマル ミルタンク
ほのお エンテイ
ほのお ギャロップ
ほのお キュウコン
ほのお バクフーン
ほのお リザードン
みず スターミー
みず ドククラゲ
むし ストライク

すばやさが100以上のポケモン達が各タイプごとに纏められて出力されています。

GROUP BY句のポイントです。

「GROUP BY 項目1,項目2」のように記載する。

ORDER BY句のように左の項目からグループ化する優先度が上がる。

SELECT句に追加した項目はGROUP BY句に追加する。

以上がポイントです。特に3つ目は忘れがちなので、しっかりと覚えましょう!!SELECT文に指定しないとエラーが発生します。

例を通してみてみましょう!!かっぱちゃんが出力された結果では納得せず、下記のように呟いています。

KappaChan
すばやさも一緒にみたいかっぱ!!

かっぱちゃんは相変わらず出力結果ですばやさが見たいようです。

いい機会なので、SELECT文のみにすばやさを追加してみます。

 出力結果
列 'Pokemon.すばやさ' は選択リスト内では無効です。この列は集計関数または GROUP BY 句に含まれていません。

エラーが発生しましたね。

このようにSQL Serverで、GROUP BY句を使用する場合は、SELECT句で使用した項目は必ずGROUP BY句に追加しなければなりません。

GROUP BY句にすばやさを追加したクエリで見てみましょう。

 出力結果
タイプ1 ポケモン名 すばやさ
あく ニューラ 115
いわ プテラ 130
エスパー エーフィ 110
エスパー セレビィ 100
エスパー フーディン 120
エスパー ミュウ 100
エスパー ミュウツー 130
エスパー ユンゲラー 105
エスパー ルギア 110
くさ ワタッコ 110
ゴースト ゲンガー 110
じめん ダグトリオ 120
でんき エレブー 105
でんき サンダー 100
でんき サンダース 130
でんき ビリリダマ 100
でんき マルマイン 150
でんき ライコウ 115
でんき ライチュウ 110
どく クロバット 130
ノーマル オニドリル 100
ノーマル ケンタロス 110
ノーマル ドードリオ 110
ノーマル ピジョット 101
ノーマル ペルシアン 115
ノーマル ミルタンク 100
ほのお エンテイ 100
ほのお ギャロップ 105
ほのお キュウコン 100
ほのお バクフーン 100
ほのお リザードン 100
みず スターミー 115
みず ドククラゲ 100
むし ストライク 105

正しく出力されましたね^^

SQLServerの他の記事はこちら

C#のエンジニアであれば、絶対買ってほしい本2選

C#の初心者にオススメ!基本はこの本で抑えよう!


Linqの使い方が沢山載っている。中級者以上の方にオススメ!

SELECT句に追加した項目をGROUP BY句に追加しなければならない理由

なぜ、GROUP BY句に追加しなければならないか考えてみましょう。

まず、下記のタイプ一覧を表示するクエリを実行してみましょう。

 出力結果
タイプ1 タイプ2
あく NULL
あく こおり
あく ひこう
あく ほのお
いわ NULL
いわ あく
いわ じめん
いわ ひこう
いわ みず
エスパー NULL
エスパー ひこう
エスパー フェアリー
エスパー むし
かくとう NULL
くさ NULL
くさ エスパー
くさ どく
くさ ひこう
ゴースト NULL
ゴースト どく
こおり エスパー
こおり じめん
こおり ひこう
じめん NULL
じめん いわ
じめん ひこう
でんき NULL
でんき はがね
でんき ひこう
どく NULL
どく じめん
どく ひこう
ドラゴン NULL
ドラゴン ひこう
ノーマル NULL
ノーマル エスパー
ノーマル ひこう
ノーマル フェアリー
はがね じめん
はがね ひこう
フェアリー NULL
フェアリー ひこう
ほのお NULL
ほのお いわ
ほのお ひこう
みず NULL
みず いわ
みず エスパー
みず かくとう
みず こおり
みず じめん
みず でんき
みず どく
みず ドラゴン
みず ひこう
みず フェアリー
むし NULL
むし いわ
むし かくとう
むし くさ
むし どく
むし はがね
むし ひこう

GROUP BY句の混乱しやすい点なので、この結果について、一つ一つ整理していきましょう。

step
1
この結果はPokemonテーブルに属する全てのポケモンのタイプ

あくまでもPokemonテーブルに属するポケモンなので、「みず、ほのお」タイプの組み合わせは存在しません。

step
2
同じタイプのポケモンの結果はGROUP BY句によって纏められている。

例えば、「くさ、ひこう」のポケモンを考えてみましょう。

「くさ、ひこう」のポケモンは下記の3匹のポケモン達がいます。

 html
ポケモン名 タイプ1 タイプ2
ハネッコ くさ ひこう
ポポッコ くさ ひこう
ワタッコ くさ ひこう

タイプ1、タイプ2をGROUP BY句で指定しているので、上記の3匹のポケモンのタイプは纏められている訳ですね。

この結果を見て、GROUP BY句にSELECT句で指定した項目「タイプ2」を追加しない場合のクエリをみてみましょう。

 出力結果
列 'Pokemon.タイプ2' は選択リスト内では無効です。この列は集計関数または GROUP BY 句に含まれていません。

上記のクエリの命令による叫びを考えてみました。

このクエリでは、先ほどの3匹のポケモンの中「くさ、ひこう」を纏めずに表示しようとしている?

1つのレコードを出力するの?それとも複数?

1つだったら、どのポケモンの「くさ、ひこう」を出力する訳?

SQLServerも困っちゃいますね!このような理由でSELECT句に追加した項目は必ずGROUP BY句に指定してあげましょう!!

KappaChan
GROUP BY句は時々混乱するからこのように考え直すといいかっぱ!

GROUP BY句に複数項目を指定

先ほどの説明でGROUP BY句に複数個指定しましたが、

GROUP BY句も複数個項目を指定できます。優先度は左側に記載した項目からです。

今回の例では、すばやさが115以上でポケモン名、タイプ1、タイプ2の項目を使用してみます。

タイプ1、タイプ2、ポケモン名の順で指定した場合

 出力結果
ポケモン名 タイプ1 タイプ2
ニューラ あく こおり
プテラ いわ ひこう
フーディン エスパー NULL
ミュウツー エスパー NULL
ダグトリオ じめん NULL
サンダース でんき NULL
マルマイン でんき NULL
ライコウ でんき NULL
クロバット どく ひこう
ペルシアン ノーマル NULL
スターミー みず エスパー

出力順がポケモン名からなので、分かりにくいですが、各タイプでポケモンが分けられていますね。

SQLServerの他の記事はこちら

タイプ2、タイプ1、ポケモン名の順で指定した場合

 出力結果
ポケモン名 タイプ2 タイプ1
フーディン NULL エスパー
ミュウツー NULL エスパー
ダグトリオ NULL じめん
サンダース NULL でんき
マルマイン NULL でんき
ライコウ NULL でんき
ペルシアン NULL ノーマル
スターミー エスパー みず
ニューラ こおり あく
プテラ ひこう いわ
クロバット ひこう どく

タイプ2がNULLのポケモンが多いので、タイプ1しかないポケモンが優先で出力されます。

ポケモン名、タイプ1、タイプ2の順で指定した場合

下記のようにポケモン名を一番左に指定した場合はポケモン名でグループ化を行います。

 出力結果
ポケモン名 タイプ1 タイプ2
クロバット どく ひこう
サンダース でんき NULL
スターミー みず エスパー
ダグトリオ じめん NULL
ニューラ あく こおり
フーディン エスパー NULL
プテラ いわ ひこう
ペルシアン ノーマル NULL
マルマイン でんき NULL
ミュウツー エスパー NULL
ライコウ でんき NULL

ポケモン名には同様の名前が存在しないので何の意味もありませんね^^;

一応、アイウエオ順にはなっているようです。

今回の例のように指定する順番によって、全く違う結果がでるので、

複数項目指定する場合は順番もしっかりと考えていきましょう!

KappaChan
グループ化の仕方がわかったかっぱ!!

まとめ

今回はGROUPBY句の基本的な使い方について学びました。

GROUPBY句にはまだ色々便利な使い方があるので、

これからもGROUPBY句関連の記事を書いていきたいと思います。

最後まで見て頂き、ありがとうございました。

KappaChan
最後までみてくれてありがとうかっぱ!

SQLServerの他の記事はこちら

 

 

 

 

プログラミング能力を上げたい方は是非オンラインのプログラミング教室も検討してみてくださいね!!

一人で独学をするよりもプロからオンラインでプログラミングを教えてもらった方が10倍は効率いいです!!

私が厳選したオススメのオンライン教室を貼っておきます!!どちら共、エンジニアとしての就職までサポートしてくれる素晴らしい教室です。キャリアなどの個別相談は無料ですよ!!

申し込みは完全無料!未経験でITエンジニアを目指したい方にオススメ!

Webエンジニアになりたい方にオススメ!個別相談は無料!

KappaChan
オンラインのプログラミング教室は本当にオススメかっぱ!!

-SQL Server

X