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

SQLで年ごとにグループ化する方法

    問題:

    データを年ごとにグループ化する必要があります。

    例I:

    データの列の1つはtransaction_dateです。 。日付が含まれています。すべてのデータを年ごとにグループ化し、毎年獲得した合計金額を計算したいとします。

    data テーブルは次のようになります:

    transaction_date お金
    2018-03-25 1700
    2019-09-12 100
    2018-07-14 1200
    2018-01-05 400
    2019-06-08 2000
    2020-03-06 1500

    解決策1(年と稼いだお金を表示):

    SELECT
      EXTRACT(year FROM transaction_date) AS year,
      SUM(money) AS money_earned
    FROM data
    GROUP BY EXTRACT(year FROM transaction_date);
    

    結果は次のとおりです。

    year money_earned
    2020 1500
    2019 2100
    2018 3300

    ソリューション2(完全な日付、年、および対応する年に稼いだお金を表示します):

    SELECT
      transaction_date AS transaction_date,
      EXTRACT(year FROM transaction_date) AS year,
      SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned
    FROM data;
    

    結果は次のとおりです。

    transaction_date money_earned
    2018-03-25 2018 3300
    2018-07-14 2018 3300
    2018-01-05 2018 3300
    2019-09-12 2019 2100
    2019-06-08 2019 2100
    2020-03-06 2020 1500

    ディスカッション:

    この例では、 yearがないことを前提としています。 桁。代わりに、完全な日付の列があります。

    まず、日付から1年を取得する必要があります。 EXTRACT(part FROM date)を使用できます それを行うための関数。あなたの場合、年を抽出したいので、 part yearです 。 日付 日付を含む列です– transaction_date 桁。その後、列の名前を年に変更することをお勧めします。 EXTRACTについて詳しく知りたい場合 関数と日付からさまざまなパーツを取得する方法については、ここで見つけることができます。

    年とその年に稼いだ合計金額だけを表示したい場合は、 GROUP BYを使用できます。 。最初に選択された列は、日付から抽出された年です。 2番目の列は、集計関数 SUM(money)です。 。クエリの最後に、 GROUP BY EXTRACT(year FROM transaction_date)が必要です。 または、より単純な GROUP BY 1(EXTRACT(year FROM transaction_date)以降 最初の列です。)

    より多くの列を表示したい場合は、ウィンドウ関数が必要です(ソリューション2)。 SUM(money)の後 OVER()を記述します 句を使用し、各年の合計を計算するため、 PARTITION BY EXTRACT(year FROM transaction_date)を使用します。 その中。合計を計算するときはまだ年の列がないことに注意してください。したがって、 PARTITION BY year 動作しません–エラーが発生します'列"year"は存在しません' 。この記事でウィンドウ関数の詳細を読むことができます。

    例II:

    データの列の1つはyearです 。この列ですべてのデータをグループ化し、毎年獲得した合計金額を計算します。

    data テーブルは次のようになります:

    year お金
    2018 3 25 1700
    2019 9 12 100
    2018 7 14 1200
    2018 1 5 400
    2019 6 8 2000
    2020 3 6 1500

    解決策1(年と稼いだお金を表示):

    SELECT
      year,
      SUM(money) AS money_earned
    FROM data
    GROUP BY year;
    

    結果は次のとおりです。

    year money_earned
    2020 1500
    2018 3300
    2019 2100

    ソリューション2(年、月、日、および対応する年に稼いだお金を表示):

    SELECT
      year,
      month,
      day,
      SUM(money) OVER(PARTITION BY year) AS money_earned
    FROM data;
    

    結果は次のとおりです。

    year money_earned
    2018 3 25 3300
    2018 7 14 3300
    2018 1 5 3300
    2019 9 12 2100
    2019 6 8 2100
    2020 3 6 1500

    ディスカッション:

    この例では、すでに yearがあることを前提としています。 列。

    年とその年に獲得した合計金額を表示する場合は、単純な GROUP BY 十分です。 GROUP BYの概念に慣れていない場合 、ここで説明します。集計関数を使用するだけです(ここでは: SUM )正しい列を使用し、クエリの最後に yearでグループ化します 。 ASを使用して列の名前を変更できます 新しい名前のキーワード。

    他の列も表示したい場合は、さらに複雑になります。次に、ウィンドウ関数を使用したソリューションが必要です(ソリューション2)。適切な列(ここでは SUM(money))で集計関数を使用する必要があります )そして OVER()を書きます その後の条項。この句では、 PARTITION BYを使用する必要があります グループ化する列を使用します。それがあなたが得る方法です:

    SUM(money) OVER(PARTITION BY year)
    

    このソリューションでは、 GROUP BYを使用しません 条項。

    ウィンドウ関数の詳細については、こちらをご覧ください。


    1. SQLitEdatabseからロードされたデータがモデルクラスArrayListandroidに保存されていません

    2. データベース設計101:MySQLのパーティション

    3. SSISパッケージを使用してXMLファイルをデータベースにロードする方法は?

    4. node.js postgresqlモジュールを使用する適切な方法は何ですか?