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

T-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
      YEAR(transaction_date) AS year,
      SUM(money) AS money_earned
    FROM data
    GROUP BY YEAR(transaction_date);
    

    結果は次のとおりです。

    year money_earned
    2020 1500
    2019 2100
    2018 3300

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

    SELECT
      transaction_date AS transaction_date,
      YEAR(transaction_date) AS year,
      SUM(money) OVER(PARTITION BY YEAR(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

    ディスカッション:

    この例では、年の列がないと想定しています。完全な日付の列があり、そこから年を取得したいと考えています。

    SQL Serverの日付から年を取得するには、YEAR()を使用できます。 働き。この関数の引数は日付である必要があります–ここでは、transaction_date 列。

    年とその年に獲得した合計金額を表示する場合は、GROUP BYを使用できます。 。最初に選択された列は、日付から抽出された年です。 2番目の列は、集計関数SUM(money)です。 。クエリの最後に、GROUP BYが必要です。 YEAR(transaction_date) 。したがって、ソリューション1。

    より多くの列を表示したい場合は、ウィンドウ関数を使用します(ソリューション2)。 SUM(money)の後 OVER()を記述します 句と、毎年グループ化するため、PARTITION BY YEAR(transaction_date)を使用します その中。 yearはまだないことに注意してください 合計を数えるときの列なので、PARTITION BY 年は機能しません。ウィンドウ関数の詳細については、こちらをご覧ください。

    例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を使用して列の名前を変更できます 新しい名前のキーワード。また、データを年で並べ替える場合は、ORDER BYを使用します クエリの最後の年。

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

    SUM(money) OVER(PARTITION BY year)
    

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

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


    1. OracleのNEXT_DAY()関数

    2. SQL ServerのCHOOSE()関数に相当するMySQLとは何ですか?

    3. Virtualmin:パスワードを変更した後はこのMySQLデータベースにアクセスできません

    4. SQL Serverでリンクサーバーを作成する(T-SQLの例)