Database
 sql >> Baza danych >  >> RDS >> Database

Jak grupować według roku w SQL

Problem:

Chcesz pogrupować swoje dane według roku.

Przykład I:

Jedna z kolumn w Twoich danych to transaction_date . Zawiera datę. Chcesz pogrupować wszystkie swoje dane według roku i obliczyć łączne pieniądze zarobione każdego roku.

date tabela wygląda tak:

data_transakcji pieniądze
2018-03-25 1700
2019-09-12 100
14-07-2018 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):

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

Wynik:

rok pieniądze_zarobione
2020 1500
2019 2100
2018 3300

Rozwiązanie 2 (wyświetlanie pełnej daty, roku i pieniędzy zarobionych w odpowiednim roku):

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;

Wynik:

data_transakcji rok pieniądze_zarobione
2018-03-25 2018 3300
14-07-2018 2018 3300
2018-01-05 2018 3300
2019-09-12 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

Dyskusja:

W tym przykładzie założono, że nie masz year kolumna. Zamiast tego masz kolumnę z pełnymi datami.

Najpierw musisz pobrać rok od daty. Możesz użyć EXTRACT(part FROM date) funkcja to zrobić. W twoim przypadku chcesz wyodrębnić rok, więc part to year . date to kolumna zawierająca daty – transaction_date kolumna. Dobrym pomysłem jest zmiana nazwy kolumny na rok później. Jeśli chcesz dowiedzieć się więcej o EXTRACT funkcji i jak pobrać różne części z daty, znajdziesz to tutaj.

Jeśli chcesz wyświetlić tylko rok i łączne pieniądze zarobione w tym roku, możesz użyć GROUP BY . Pierwsza wybrana kolumna to rok wyodrębniony z daty. Druga kolumna to funkcja agregująca SUM(money) . Na końcu zapytania potrzebujesz GROUP BY EXTRACT(year FROM transaction_date) lub prościej, GROUP BY 1 (since EXTRACT(year FROM transaction_date) to pierwsza kolumna.)

Jeśli chcesz wyświetlić więcej kolumn, potrzebujesz funkcji okna (Rozwiązanie 2). Po SUM(money) piszesz OVER() klauzuli, a ponieważ chcesz obliczyć sumę za każdy rok, użyj PARTITION BY EXTRACT(year FROM transaction_date) w środku tego. Pamiętaj, że nie masz jeszcze kolumny roku podczas obliczania sumy, więc PARTITION BY year nie zadziała – pojawi się błąd 'column "year" does not exist' . Możesz przeczytać więcej o funkcjach okien w tym artykule.

Przykład II:

Jedna z kolumn w Twoich danych to year . Chcesz pogrupować wszystkie swoje dane według tej kolumny i obliczyć łączną sumę pieniędzy zarobionych każdego roku.

date tabela wygląda tak:

rok miesiąc dzień pieniądze
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):

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

Wynik:

rok pieniądze_zarobione
2020 1500
2018 3300
2019 2100

Rozwiązanie 2 (wyświetlanie roku, miesiąca, dnia i pieniędzy zarobionych w odpowiednim roku):

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

Wynik:

rok miesiąc dzień pieniądze_zarobione
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Dyskusja:

W tym przykładzie założono, że masz już year kolumna.

Jeśli chcesz wyświetlić rok i łączne pieniądze zarobione w tym roku, proste GROUP BY wystarczy. Jeśli nie czujesz się komfortowo z koncepcją GROUP BY , spójrz tutaj, gdzie to wyjaśniamy. Wystarczy użyć funkcji agregującej (tutaj:SUM ) z poprawną kolumną i na końcu zapytania grupujesz według year . Możesz zmienić nazwę kolumny za pomocą AS słowo kluczowe z nową nazwą.

Sprawa jest bardziej skomplikowana, jeśli chcesz wyświetlić także inne kolumny. Wtedy potrzebujesz rozwiązania wykorzystującego funkcję okna (Rozwiązanie 2). Powinieneś użyć funkcji agregującej z odpowiednią kolumną (tutaj:SUM(money) ) i napisz OVER() klauzuli później. W tej klauzuli powinieneś użyć PARTITION BY z kolumną, według której chcesz pogrupować. W ten sposób otrzymujesz:

SUM(money) OVER(PARTITION BY year)

W tym rozwiązaniu nie używasz GROUP BY klauzula.

Możesz przeczytać więcej o funkcjach okien tutaj.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodawać komentarze w SQL?

  2. Projektowanie bazy danych dla internetowego portalu pracy

  3. Jak dodać dni do daty w T-SQL

  4. Polecenie T-SQL do rzeczy

  5. Czas przycinania od datetime – kontynuacja