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

初心者向けのSQLGROUPBY句

    SQLでは、GROUP BY 句を使用して、クエリの結果を行のグループに分割できます。

    これは通常、各グループで1つ以上の集計を実行するために行われます。

    例1

    GROUP BYを示す例を次に示します。 条項。

    次の表を見てください:

    SELECT * FROM Products;

    結果:

    +-------------+------------+---------------------------------+----------------+-----------------------------------------+
    | ProductId   | VendorId   | ProductName                     | ProductPrice   | ProductDescription                      |
    |-------------+------------+---------------------------------+----------------+-----------------------------------------|
    | 1           | 1001       | Left handed screwdriver         | 25.99          | Purple. Includes left handed carry box. |
    | 2           | 1001       | Long Weight (blue)              | 14.75          | Includes a long wait.                   |
    | 3           | 1001       | Long Weight (green)             | 11.99          | Approximate 30 minute waiting period.   |
    | 4           | 1002       | Sledge Hammer                   | 33.49          | Wooden handle. Free wine glasses.       |
    | 5           | 1003       | Chainsaw                        | 245.00         | Orange. Includes spare fingers.         |
    | 6           | 1003       | Straw Dog Box                   | 55.99          | Tied with vines. Very chewable.         |
    | 7           | 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           | Brown ceramic with solid handle.        |
    +-------------+------------+---------------------------------+----------------+-----------------------------------------+

    そのテーブルに対して次のクエリを実行できます。

    SELECT 
        VendorId,
        COUNT(VendorId) AS Count
    FROM Products
    GROUP BY VendorId;

    結果:

    +------------+---------+
    | VendorId   | Count   |
    |------------+---------|
    | 1001       | 3       |
    | 1002       | 1       |
    | 1003       | 2       |
    | 1004       | 1       |
    +------------+---------+

    ここでは、COUNT()を使用します 各VendorIdの行数を返す集計関数 、次にGROUP BY 結果をグループ化する句。

    例2

    この例では、SUM()を使用します 地区内のすべての都市の総人口を返す集計関数、次にGROUP BY 結果をグループ化する句。

    Cityというテーブルがあるとします。 これは、都市名とその人口、およびそれぞれの国コードと地区を(それぞれの個別の列に)格納します。

    このように:

    SELECT * FROM city
    WHERE CountryCode IN ('AGO', 'ARE', 'AUS');

    結果:

    +------+---------------+---------------+-----------------+--------------+
    | ID   | Name          | CountryCode   | District        | Population   |
    |------+---------------+---------------+-----------------+--------------|
    | 56   | Luanda        | AGO           | Luanda          | 2022000      |
    | 57   | Huambo        | AGO           | Huambo          | 163100       |
    | 58   | Lobito        | AGO           | Benguela        | 130000       |
    | 59   | Benguela      | AGO           | Benguela        | 128300       |
    | 60   | Namibe        | AGO           | Namibe          | 118200       |
    | 64   | Dubai         | ARE           | Dubai           | 669181       |
    | 65   | Abu Dhabi     | ARE           | Abu Dhabi       | 398695       |
    | 66   | Sharja        | ARE           | Sharja          | 320095       |
    | 67   | al-Ayn        | ARE           | Abu Dhabi       | 225970       |
    | 68   | Ajman         | ARE           | Ajman           | 114395       |
    | 130  | Sydney        | AUS           | New South Wales | 3276207      |
    | 131  | Melbourne     | AUS           | Victoria        | 2865329      |
    | 132  | Brisbane      | AUS           | Queensland      | 1291117      |
    | 133  | Perth         | AUS           | West Australia  | 1096829      |
    | 134  | Adelaide      | AUS           | South Australia | 978100       |
    | 135  | Canberra      | AUS           | Capital Region  | 322723       |
    | 136  | Gold Coast    | AUS           | Queensland      | 311932       |
    | 137  | Newcastle     | AUS           | New South Wales | 270324       |
    | 138  | Central Coast | AUS           | New South Wales | 227657       |
    | 139  | Wollongong    | AUS           | New South Wales | 219761       |
    | 140  | Hobart        | AUS           | Tasmania        | 126118       |
    | 141  | Geelong       | AUS           | Victoria        | 125382       |
    | 142  | Townsville    | AUS           | Queensland      | 109914       |
    | 143  | Cairns        | AUS           | Queensland      | 92273        |
    +------+---------------+---------------+-----------------+--------------+

    結果を3か国に減らしました。そうしないと、リストはになります。 この記事には長すぎます。

    ここで、各地区の人口を取得し、各地区をその人口と国コードとともに一覧表示したいとします。

    これができます。

    SELECT
        CountryCode,
        District,
        SUM(Population) AS Population
    FROM City
    WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
    GROUP BY CountryCode, District
    ORDER BY CountryCode;

    結果:

    +---------------+-----------------+--------------+
    | CountryCode   | District        | Population   |
    |---------------+-----------------+--------------|
    | AGO           | Benguela        | 258300       |
    | AGO           | Huambo          | 163100       |
    | AGO           | Luanda          | 2022000      |
    | AGO           | Namibe          | 118200       |
    | ARE           | Abu Dhabi       | 624665       |
    | ARE           | Ajman           | 114395       |
    | ARE           | Dubai           | 669181       |
    | ARE           | Sharja          | 320095       |
    | AUS           | Capital Region  | 322723       |
    | AUS           | New South Wales | 3993949      |
    | AUS           | Queensland      | 1805236      |
    | AUS           | South Australia | 978100       |
    | AUS           | Tasmania        | 126118       |
    | AUS           | Victoria        | 2990711      |
    | AUS           | West Australia  | 1096829      |
    +---------------+-----------------+--------------+

    結果が指定どおりにグループ化されていることがわかります。これで、各地区の完全な人口が取得されます(個々の都市の人口とは対照的に、基になるテーブルに格納されます)。

    GROUP BYに注意してください 句は、WHEREの後に指定する必要があります 句とORDER BYの前 条項。

    地区ではなく各国の人口を取得したい場合、クエリはさらにコンパクトになります。

    SELECT
        CountryCode,
        SUM(Population) AS Population
    FROM City
    WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
    GROUP BY CountryCode
    ORDER BY CountryCode;

    結果:

    +---------------+--------------+
    | CountryCode   | Population   |
    |---------------+--------------|
    | AGO           | 2561600      |
    | ARE           | 1728336      |
    | AUS           | 11313666     |
    +---------------+--------------+

    この特定のサンプルデータベースは非常に古く、人口数は現在の現実を反映していないことに注意してください。

    例3–HAVING句

    HAVINGを含めることができます GROUP BYを含む句 グループをフィルタリングする句。

    例:

    SELECT
        CountryCode,
        District,
        SUM(Population) AS Population
    FROM City
    WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
    GROUP BY CountryCode, District
    HAVING SUM(Population) > 1000000
    ORDER BY CountryCode;

    結果:

    +---------------+-----------------+--------------+
    | CountryCode   | District        | Population   |
    |---------------+-----------------+--------------|
    | AGO           | Luanda          | 2022000      |
    | AUS           | New South Wales | 3993949      |
    | AUS           | Queensland      | 1805236      |
    | AUS           | Victoria        | 2990711      |
    | AUS           | West Australia  | 1096829      |
    +---------------+-----------------+--------------+

    HAVING 句はWHEREに似ています WHEREを除く句 HAVINGに対して、個々の行をフィルタリングします グループをフィルタリングします。

    また、WHERE 句はのデータをフィルタリングします グループ化されているのに対し、HAVING のデータをフィルタリングします グループ化されます。

    HAVING 句は、WHEREで使用できるのと同じ演算子を受け入れます 句(=など) 、) Operator for Beginners">>=) Operator for Beginners">>=INLIKE など)。


    1. SQLServerエージェントアラート

    2. 個別のレコードに対するPIVOTクエリ

    3. DATE列にjava.sql.Timestampを渡すと、Oracleが非常に遅いのはなぜですか?

    4. SQLのピアソン相関係数式