Database
 sql >> база данни >  >> RDS >> Database

Как да групирате по година в SQL

Проблем:

Искате да групирате данните си по години.

Пример I:

Една от колоните във вашите данни е transaction_date . Съдържа дата. Искате да групирате всичките си данни по години и да изчислите общите пари, спечелени всяка година.

data таблицата изглежда така:

transaction_date пари
25-03-2018 1700
12.09.2019 100
14.07.2018 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

Решение 1 (показване на годината и спечелените пари):

SELECT
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM transaction_date);

Резултатът е:

година печелени_пари
2020 1500
2019 2100
2018 3300

Решение 2 (показване на пълната дата, годината и парите, спечелени през съответната година):

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;

Резултатът е:

transaction_date година печелени_пари
25-03-2018 2018 3300
14.07.2018 2018 3300
2018-01-05 2018 3300
12.09.2019 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

Дискусия:

В този пример се приема, че нямате year колона. Вместо това имате колоната с пълни дати.

Първо, трябва да извлечете година от датата. Можете да използвате EXTRACT(part FROM date) функция, за да го направите. Във вашия случай искате да извлечете годината, така че part е year . date е колоната, която съдържа датите – transaction_date колона. Добра идея е колоната да се преименува на година след това. Ако искате да научите повече за EXTRACT функция и как да извлечете различни части от датата, можете да я намерите тук.

Ако искате да покажете само годината и общите пари, спечелени през тази година, можете да използвате GROUP BY . Първата избрана колона е годината, извлечена от датата. Втората колона е агрегатната функция SUM(money) . В края на заявката се нуждаете от GROUP BY EXTRACT(year FROM transaction_date) или, по-просто, GROUP BY 1 (since EXTRACT(year FROM transaction_date) е първата колона.)

Ако искате да покажете повече колони, имате нужда от функция на прозорец (Решение 2). След SUM(money) пишете OVER() клауза и тъй като искате да изчислите сумата за всяка година, използвайте PARTITION BY EXTRACT(year FROM transaction_date) вътре в него. Имайте предвид, че все още нямате колоната за годината, когато изчислявате сумата, така че PARTITION BY year няма да работи – ще получите грешка 'column "year" does not exist' . Можете да прочетете повече за функциите на прозореца в тази статия.

Пример II:

Една от колоните във вашите данни е year . Искате да групирате всичките си данни по тази колона и да изчислите общите спечелени пари всяка година.

data таблицата изглежда така:

година месец ден пари
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Решение 1 (показване на годината и спечелените пари):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

Резултатът е:

година печелени_пари
2020 1500
2018 3300
2019 2100

Решение 2 (показва година, месец, ден и парите, спечелени през съответната година):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

Резултатът е:

година месец ден печелени_пари
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Дискусия:

В този пример се предполага, че вече имате year колона.

Ако искате да покажете годината и общите пари, спечелени през тази година, просто GROUP BY е достатъчно. Ако не се чувствате комфортно с концепцията за GROUP BY , вижте тук, където го обясняваме. Вие просто използвате агрегатната функция (тук:SUM ) с правилната колона и в края на заявката групирате по year . Можете да преименувате колоната с помощта на AS ключова дума с ново име.

По-сложно е, ако искате да покажете и някои други колони. След това се нуждаете от решението с помощта на функция прозорец (Решение 2). Трябва да използвате агрегатната функция със съответната колона (тук:SUM(money) ) и напишете OVER() клауза след това. В тази клауза трябва да използвате PARTITION BY с колоната, по която искате да групирате. Така получавате:

SUM(money) OVER(PARTITION BY year)

В това решение не използвате GROUP BY клауза.

Можете да прочетете повече за функциите на прозореца тук.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Цели на редове, част 2:Полусъединяване

  2. Съхранение на файлове в SQL база данни с помощта на FILESTREAM – част 1

  3. Базиране на модели на бази данни в реалността:Предизвикателството на блогъра

  4. SQL заявка за сравняване на продажбите на продукти по месеци

  5. Прагове за оптимизиране – групиране и агрегиране на данни, част 5