sql >> Databáze >  >> RDS >> Database

Jak seskupit podle roku v SQL

Problém:

Chcete seskupit data podle roku.

Příklad I:

Jeden ze sloupců ve vašich datech je transaction_date . Obsahuje datum. Chtěli byste seskupit všechna svá data podle roku a vypočítat celkové peníze vydělané každý rok.

data tabulka vypadá takto:

transaction_date peníze
25.03.2018 1700
2019-09-12 100
2018-07-14 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

Řešení 1 (zobrazení roku a vydělaných peněz):

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

Výsledek je:

rok peníze_vydělané
2020 1500
2019 2100
2018 3300

Řešení 2 (zobrazení úplného data, roku a peněz vydělaných v odpovídajícím roce):

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;

Výsledek je:

transaction_date rok peníze_vydělané
25.03.2018 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

Diskuse:

V tomto příkladu se předpokládá, že nemáte year sloupec. Místo toho máte sloupec s úplnými daty.

Nejprve musíte získat rok od data. Můžete použít EXTRACT(part FROM date) funkci k tomu. Ve vašem případě byste chtěli extrahovat rok, tedy part je year . date je sloupec, který obsahuje data – transaction_date sloupec. Je dobré sloupec přejmenovat na rok poté. Pokud se chcete dozvědět více o EXTRACT funkce a jak získat různé části z data, najdete zde.

Pokud chcete zobrazit pouze rok a celkové peníze vydělané v tomto roce, můžete použít GROUP BY . První vybraný sloupec je rok extrahovaný z data. Druhý sloupec je agregační funkce SUM(money) . Na konci dotazu potřebujete GROUP BY EXTRACT(year FROM transaction_date) nebo, jednodušeji, GROUP BY 1 (since EXTRACT(year FROM transaction_date) je první sloupec.)

Pokud chcete zobrazit více sloupců, potřebujete funkci okna (řešení 2). Po SUM(money) napíšete OVER() klauzuli a protože chcete vypočítat součet za každý rok, použijte PARTITION BY EXTRACT(year FROM transaction_date) uvnitř toho. Všimněte si, že při výpočtu součtu ještě nemáte sloupec rok, takže PARTITION BY year nebude fungovat – zobrazí se chyba 'column "year" does not exist' . Více o funkcích okna si můžete přečíst v tomto článku.

Příklad II:

Jeden ze sloupců ve vašich údajích je year . Chtěli byste seskupit všechna svá data do tohoto sloupce a vypočítat celkové peníze vydělané každý rok.

data tabulka vypadá takto:

rok měsíc den peníze
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Řešení 1 (zobrazení roku a vydělaných peněz):

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

Výsledek je:

rok peníze_vydělané
2020 1500
2018 3300
2019 2100

Řešení 2 (zobrazení roku, měsíce, dne a peněz vydělaných v odpovídajícím roce):

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

Výsledek je:

rok měsíc den peníze_vydělané
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Diskuse:

V tomto příkladu se předpokládá, že již máte year sloupec.

Chcete-li zobrazit rok a celkové peníze vydělané v tomto roce, použijte jednoduchý GROUP BY stačí. Pokud se necítíte dobře s konceptem GROUP BY , podívejte se sem, kde to vysvětlujeme. Jednoduše použijete agregační funkci (zde:SUM ) se správným sloupcem a na konci dotazu seskupte podle year . Sloupec můžete přejmenovat pomocí AS klíčové slovo s novým názvem.

Je to složitější, pokud byste chtěli zobrazit i některé další sloupce. Pak potřebujete řešení pomocí funkce okna (Řešení 2). Měli byste použít agregační funkci s příslušným sloupcem (zde:SUM(money) ) a napište OVER() doložka následně. V tomto článku byste měli použít PARTITION BY se sloupcem, podle kterého chcete seskupit. Takto získáte:

SUM(money) OVER(PARTITION BY year)

V tomto řešení nepoužíváte GROUP BY doložka.

Více o funkcích okna si můžete přečíst zde.


  1. Přiřazení obrázků k položkám ListView Výukový program-03

  2. Jak změníte datový typ sloupce na serveru SQL?

  3. psql:FATAL:role postgres neexistuje

  4. Je dobrým zvykem používat ContentProvider ke zpracování databázových operací?