sql >> Databasteknik >  >> RDS >> Database

Hur man grupperar efter år i T-SQL

Problem:

Du vill gruppera dina data efter år.

Exempel I:

En av kolumnerna i din data är transaction_date . Den innehåller ett datum. Du skulle vilja gruppera all din data efter år och beräkna den totala summan som tjänats in varje år.

data tabellen ser ut så här:

transaction_date pengar
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 (visar år och intjänade pengar):

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

Resultatet är:

år pengar_intjänade
2020 1500
2019 2100
2018 3300

Lösning 2 (visar hela datumet, året och pengarna som tjänats in under motsvarande å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 är:

transaction_date år pengar_intjänade
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 det här exemplet antas det att du inte har kolumnen år. Du har kolumnen med fullständiga datum och skulle vilja hämta årtalet från den.

För att hämta ett år från datumet i SQL Server kan du använda YEAR() fungera. Argumentet för denna funktion bör vara ett datum – här transaction_date kolumn.

Om du vill visa året och de totala intjänade pengarna under det här året kan du använda en GROUP BY . Den första valda kolumnen är det årtal som extraheras från datumet. Den andra kolumnen är aggregatfunktionen SUM(money) . I slutet av frågan behöver du en GROUP BY YEAR(transaction_date) . Därav lösning 1.

Om du vill visa fler kolumner använder du en fönsterfunktion (lösning 2). Efter SUM(money) du skriver OVER() och, eftersom du vill gruppera efter varje år, använd PARTITION BY YEAR(transaction_date) innuti. Observera att du ännu inte har year kolumn när summan räknas, så PARTITION BY året kommer inte att fungera. Du kan läsa mer om fönsterfunktionerna här.

Exempel II:

En av kolumnerna i din data är year . Du skulle vilja gruppera all din data i den här kolumnen och beräkna den totala summan som tjänas in varje år.

data tabellen ser ut så här:

år månad dag pengar
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 (visar år och intjänade pengar):

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

Resultatet är:

år pengar_intjänade
2020 1500
2018 3300
2019 2100

Lösning 2 (visar år, månad, dag och pengarna som tjänats in under motsvarande år):

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

Resultatet är:

år månad dag pengar_intjänade
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 det här exemplet antas det att du redan har year kolumn.

Om du bara vill visa året och de totala intjänade pengarna under detta år, en enkel GROUP BY är nog. Om du inte känner dig bekväm med konceptet GROUP BY, ta en titt här där vi förklarar det. Du använder helt enkelt aggregatfunktionen (här:SUM ) med rätt kolumn och i slutet av frågan grupperar du efter year . Du kan byta namn på kolumnen med AS nyckelord med ett nytt namn. Om du vill ha uppgifterna sorterade efter år, använd ORDER BY år i slutet av din fråga.

Det är mer komplicerat om du också vill visa några andra kolumner. Då behöver du lösningen med hjälp av en fönsterfunktion (lösning 2). Du bör använda aggregatfunktionen med lämplig kolumn (SUM(money) ) och skriv OVER() klausul efteråt. I den här klausulen ska du använda PARTITION BY med kolumnen som du vill gruppera efter. Så får du:

SUM(money) OVER(PARTITION BY year)

I den här lösningen använder du inte en GROUP BY klausul.

Du kan läsa mer om fönsterfunktionerna här.


  1. Använda SSH Tunneling som ett VPN-alternativ

  2. Hur tar man bort ledande och efterföljande blanksteg i ett MySQL-fält?

  3. SQL Server Update Trigger, få endast modifierade fält

  4. Fullständig lista över teckenuppsättningar som stöds av MariaDB