sql >> データベース >  >> RDS >> PostgreSQL

Group By句を持つ—eleinのGeneralBits

    一部の人々は、クエリで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句の順序が重要です。

    1. SQL Serverなしで.mdfデータベースにアクセスすることは可能ですか?

    2. MariaDBでのCOALESCE()のしくみ

    3. ORA-01653:表領域で表を拡張できませんORA-06512

    4. OracleでのCTEの作成