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.