sql >> Database >  >> RDS >> Database

Hoe te groeperen op jaar in T-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
  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.


  1. Hoe voer je een selectiequery uit in een DO-blok?

  2. Hoe vaak moet u een back-up maken van uw databases?

  3. Moet een databaseverbinding altijd open blijven of alleen worden geopend als dat nodig is?

  4. Generate_series in Postgres vanaf begin- en einddatum in een tabel