sql >> Database >  >> RDS >> Database

Hoe te groeperen op jaar in SQL

Probleem:

U wilt uw gegevens per jaar groeperen.

Voorbeeld I:

Een van de kolommen in uw gegevens is transaction_date . Er staat een datum in. U wilt al uw gegevens per jaar groeperen en het totale verdiende geld per jaar berekenen.

De data tabel ziet er als volgt uit:

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

Oplossing 1 (weergave van het jaar en het verdiende geld):

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

Het resultaat is:

jaar geld_verdiend
2020 1500
2019 2100
2018 3300

Oplossing 2 (met de volledige datum, het jaar en het verdiende geld in het overeenkomstige jaar):

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;

Het resultaat is:

transactiedatum jaar geld_verdiend
25-03-2018 2018 3300
14-07-2018 2018 3300
05-01-2018 2018 3300
2019-09-12 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

Discussie:

In dit voorbeeld wordt aangenomen dat u het year . niet heeft kolom. In plaats daarvan heb je de kolom met volledige datums.

Eerst moet u een jaar na de datum ophalen. U kunt de EXTRACT(part FROM date) . gebruiken functie om het te doen. In jouw geval wil je het jaar extraheren, dus het part is year . De date is de kolom die de datums bevat – de transaction_date kolom. Het is een goed idee om de kolom later te hernoemen naar jaar. Als je meer wilt weten over de EXTRACT functie en hoe u verschillende delen van de datum kunt ophalen, vindt u hier.

Als u alleen het jaar en het totale verdiende geld in dit jaar wilt weergeven, kunt u een GROUP BY gebruiken . De eerste geselecteerde kolom is het jaar dat uit de datum is gehaald. De tweede kolom is de aggregatiefunctie SUM(money) . Aan het einde van de zoekopdracht heeft u een GROUP BY EXTRACT(year FROM transaction_date) nodig of, eenvoudiger, GROUP BY 1 (since EXTRACT(year FROM transaction_date) is de eerste kolom.)

Als u meer kolommen wilt weergeven, heeft u een vensterfunctie nodig (oplossing 2). Na SUM(money) je schrijft de OVER() clausule en, aangezien u de som voor elk jaar wilt berekenen, gebruikt u PARTITION BY EXTRACT(year FROM transaction_date) in het. Merk op dat je de jaarkolom nog niet hebt bij het berekenen van de som, dus PARTITION BY year werkt niet – u krijgt een foutmelding 'column "year" does not exist' . U kunt meer lezen over de vensterfuncties in dit artikel.

Voorbeeld II:

Een van de kolommen in uw gegevens is year . U wilt al uw gegevens in deze kolom groeperen en het totale verdiende geld per jaar berekenen.

De data tabel ziet er als volgt uit:

jaar maand dag geld
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Oplossing 1 (weergave van het jaar en het verdiende geld):

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

Het resultaat is:

jaar geld_verdiend
2020 1500
2018 3300
2019 2100

Oplossing 2 (weergave van jaar, maand, dag en het verdiende geld in het overeenkomstige jaar):

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

Het resultaat is:

jaar maand dag geld_verdiend
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Discussie:

In dit voorbeeld wordt aangenomen dat u het year . al heeft kolom.

Als u het jaar en het totale verdiende geld in dit jaar wilt weergeven, voert u een eenvoudige GROUP BY is genoeg. Als u zich niet op uw gemak voelt bij het concept van GROUP BY , kijk dan hier waar we het uitleggen. U gebruikt gewoon de aggregatiefunctie (hier:SUM ) met de juiste kolom en aan het einde van de zoekopdracht groepeert u op year . U kunt de kolom hernoemen met de AS zoekwoord met een nieuwe naam.

Het is ingewikkelder als u ook enkele andere kolommen wilt weergeven. Dan heb je de oplossing nodig met een vensterfunctie (Oplossing 2). U moet de aggregatiefunctie gebruiken met de juiste kolom (hier:SUM(money) ) en schrijf de OVER() clausule achteraf. In deze clausule moet u PARTITION BY . gebruiken met de kolom waarop u wilt groeperen. Zo krijg je:

SUM(money) OVER(PARTITION BY year)

In deze oplossing gebruikt u geen GROUP BY clausule.

U kunt hier meer lezen over de vensterfuncties.


  1. Wat is het equivalent van Oracle's REF CURSOR in MySQL bij gebruik van JDBC?

  2. SQL ALTER TABLE voor beginners

  3. Ondersteuning voor externe sleutels inschakelen in SQLite

  4. Laravel instellen op een Mac php artisan migreerfout:geen dergelijk bestand of map