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.