一部の人々は、クエリでGROUPBY句とHAVING句を避けるために非常に長い時間を費やしています。エラーメッセージはうるさいですが、通常は正しいです。 GROUP BYおよびHAVINGキーワードは、優れたSQLレポートに不可欠です。
GROUP BYの主な理由は、通常は集計によって行数を減らすことです。入力からの一致するグループごとに1つの行のみを生成します。これにより、通常のSQLを介して高度な計算を行うことができます。
果物の例:
実があります:
この次のケースでは、楽しみにしています。年の半ばには、どのような果物が利用できるようになりますか?上記と同じクエリでこれを行いますが、クエリの実行後、have句を使用してmin(fresh_until)の値を確認します。 HAVINGは、骨材を認定する方法です。
すべてのリンゴとブドウは年の半ばに利用可能になります。
SELECTとFROMの間のアイテムのリスト、ターゲットリスト。非集計と集計が含まれる場合があります。ターゲットリスト内のこれらの非集計列は、
groupby句に含まれている必要があります。エラーメッセージはそう言っています。 groupby句の列の順序が重要です。集計をグループ化する方法を決定します。多くの場合、順序は階層的です。それがあなたのコラムにとって意味することはあなたの焦点です。それは果物、またはソースおよび/またはfresh_untildateである可能性があります。
トランプの例
トランプに関する情報の抽出を説明する別の例を見てみましょう。カードについては、ウィキペディアの標準カードで学ぶことができます。
6人がポーカーをプレーするように、プログラムで6枚の5カードハンドを配るとします。この取引では合計30枚のカードが使用されます。彼らは手にある カードとスーツの名前がルックアップテーブルによって結合されている次のようなテーブル。ランクを保存して、適切に並べ替えることができます。表示には名前を使用します。名前とランクは、カードとスーツごとに1対1の関係にあります。
各ハンドのスーツカウントはいくつですか?私たちは実際には、同じスートのカードが3枚以上あるハンドのみを気にします。それは誰がポーカーフラッシュのより良いチャンスを持っているかを教えてくれます。 GROUPBYはORDERBYを意味するように見えますが、そうではないことに注意してください。 ORDERBYは明示的である必要があります。
では、クエリを誤ってグループ化した場合はどうなりますか?この手の場合 テーブルはハンディでグループ化されていないので、5枚のカードの6つのハンドの30のレコードを取得します。集計がある場合、それらは行ごとにグループ化されます。あまり役に立たなかった。
カード名を集計し、
ターゲットリストにカード名soloを含めず、カード名で並べ替えようとすると、
含まれてはならないというエラーメッセージが表示されます。
orderby句。 order by句には、group by句の要素が含まれている必要があります。
ただし、カード名がターゲットリストに明示的に含まれている場合は、
その場合、カード名はgroup by句に含まれている必要があり、
したがって、orderby句で許可されます。
クエリがスーツによるものである場合、6つのハンドのそれぞれについて、スーツごとに最小1つまたは最大4つのレコードがあります。スーツランクで並べ替えていることに注意してください。
これもgroupby句に含まれている必要があります。 su_nameとsu_rankには1対1の関係があります。
手札へのカードの分布を確認するには、カードランクの列でグループ化する必要があります。もちろん、各カードには4つのスートがあるので、4つ以上の手札にカードが表示されることはありません。
誰がエースを持っているかを覗いて確認するには、次の短いクエリを使用できます。行の収集中に実行されるWHERE句があることに注意してください。 HAVINGは、行が収集された後に実行されます。
概要
これらの例は、既知のエンティティを評価する簡単な方法です。これらの簡単なルールを試して使用してください。
- 列がターゲットリストにあり、集計ではない場合、その列はGROUPBY句に含まれている必要があります。
- WHERE句は選択プロセス中に発生します。
- HAVING句は、集計が完了した後に発生します。
- ORDERBY句に含めることができるのは非集計のみです。
- GROUPBY句の順序が重要です。