問題:
データを年ごとにグループ化する必要があります。
例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
を使用しません 条項。
ウィンドウ関数の詳細については、こちらをご覧ください。