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.