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 YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(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, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(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 je de kolom jaar niet hebt. U heeft de kolom met volledige datums en wilt er het jaar uit halen.
Om een jaar vanaf de datum in SQL Server op te halen, kunt u de YEAR()
. gebruiken functie. Het argument van deze functie moet een datum zijn – hier de transaction_date
kolom.
Als u 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
. nodig YEAR(transaction_date)
. Vandaar oplossing 1.
Als u meer kolommen wilt weergeven, gebruikt u een vensterfunctie (oplossing 2). Na SUM(money)
je schrijft de OVER()
clausule en, aangezien u elk jaar wilt groeperen, gebruikt u PARTITION BY YEAR(transaction_date)
in het. Houd er rekening mee dat je het year
nog niet hebt kolom bij het tellen van de som, dus PARTITION BY
jaar gaat niet lukken. U kunt hier meer lezen over de vensterfuncties.
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 alleen het jaar en het totale verdiende geld in dit jaar wilt weergeven, voert u een eenvoudige GROUP BY
is genoeg. Als je je niet prettig 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
trefwoord met een nieuwe naam. Als u de gegevens op jaar wilt sorteren, gebruik dan ORDER BY
jaar aan het einde van uw zoekopdracht.
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 (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.