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