sql >> Database teknologi >  >> RDS >> Database

Sådan grupperes efter år i T-SQL

Problem:

Du vil gruppere dine data efter år.

Eksempel I:

En af kolonnerne i dine data er transaction_date . Den indeholder en dato. Du vil gerne gruppere alle dine data efter år og beregne de samlede penge, der er tjent hvert år.

data tabellen ser sådan ud:

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

Løsning 1 (viser året og de tjente penge):

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

Resultatet er:

år penge_tjent
2020 1500
2019 2100
2018 3300

Løsning 2 (viser den fulde dato, året og pengene tjent i det tilsvarende år):

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

Resultatet er:

transaktionsdato år penge_tjent
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

Diskussion:

I dette eksempel antages det, at du ikke har kolonnen år. Du har kolonnen med fuldstændige datoer og vil gerne hente året fra den.

For at hente et år fra datoen i SQL Server, kan du bruge YEAR() fungere. Argumentet for denne funktion skal være en dato – her transaction_date kolonne.

Hvis du gerne vil vise året og de samlede penge tjent i år, kan du bruge en GROUP BY . Den første valgte kolonne er året udtrukket fra datoen. Den anden kolonne er den samlede funktion SUM(money) . I slutningen af ​​forespørgslen skal du bruge en GROUP BY YEAR(transaction_date) . Derfor Løsning 1.

Hvis du gerne vil have vist flere kolonner, bruger du en vinduesfunktion (løsning 2). Efter SUM(money) du skriver OVER() klausul, og da du gerne vil gruppere efter hvert år, skal du bruge PARTITION BY YEAR(transaction_date) inde i den. Bemærk, at du endnu ikke har year kolonne, når summen tælles, så PARTITION BY år virker ikke. Du kan læse mere om vinduesfunktionerne her.

Eksempel II:

En af kolonnerne i dine data er year . Du vil gerne gruppere alle dine data efter denne kolonne og beregne de samlede penge, der er tjent hvert år.

data tabellen ser sådan ud:

år måned dag penge
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Løsning 1 (viser året og de tjente penge):

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

Resultatet er:

år penge_tjent
2020 1500
2018 3300
2019 2100

Løsning 2 (viser år, måned, dag og pengene tjent i det tilsvarende år):

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

Resultatet er:

år måned dag penge_tjent
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Diskussion

I dette eksempel antages det, at du allerede har year kolonne.

Hvis du kun vil vise året og de samlede penge, der er tjent i dette år, skal du bruge en simpel GROUP BY er nok. Hvis du ikke føler dig tryg ved konceptet GROUP BY, så tag et kig her, hvor vi forklarer det. Du bruger blot aggregatfunktionen (her:SUM ) med den korrekte kolonne og i slutningen af ​​forespørgslen grupperer du efter year . Du kan omdøbe kolonnen ved at bruge AS søgeord med et nyt navn. Hvis du gerne vil have data sorteret efter år, skal du også bruge ORDER BY år i slutningen af ​​din forespørgsel.

Det er mere kompliceret, hvis du også gerne vil vise nogle andre kolonner. Så skal du bruge løsningen ved hjælp af en vinduesfunktion (løsning 2). Du skal bruge aggregatfunktionen med den relevante kolonne (SUM(money) ) og skriv OVER() klausul bagefter. I denne klausul skal du bruge PARTITION BY med den kolonne, som du vil gruppere efter. Sådan får du:

SUM(money) OVER(PARTITION BY year)

I denne løsning bruger du ikke en GROUP BY klausul.

Du kan læse mere om vinduesfunktionerne her.


  1. SQLServer IDENTITY Kolonne med tekst

  2. Indsættelse af et billede fra Oracle i SQL Server

  3. MariaDB JSON_COMPACT() Forklaret

  4. Skrivning af læsbar kode til VBA – Prøv* mønster