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

Jak grupować według roku w T-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.

data 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
  YEAR(transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY YEAR(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,
  YEAR(transaction_date) AS year,
  SUM(money) OVER(PARTITION BY YEAR(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 kolumny roku. Masz kolumnę z pełnymi datami i chcesz pobrać z niej rok.

Aby pobrać rok od daty w SQL Server, możesz użyć YEAR() funkcjonować. Argumentem tej funkcji powinna być data – tutaj transaction_date kolumna.

Jeśli chcesz wyświetlić 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 YEAR(transaction_date) . Stąd rozwiązanie 1.

Jeśli chcesz wyświetlić więcej kolumn, użyj funkcji okna (Rozwiązanie 2). Po SUM(money) piszesz OVER() i, ponieważ chcesz pogrupować według każdego roku, użyj PARTITION BY YEAR(transaction_date) w środku tego. Pamiętaj, że nie masz jeszcze year kolumna podczas liczenia sumy, więc PARTITION BY rok nie zadziała. Możesz przeczytać więcej o funkcjach okien tutaj.

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.

data 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ć tylko rok i łączne pieniądze zarobione w tym roku, proste GROUP BY wystarczy. Jeśli nie czujesz się komfortowo z koncepcją GROUP BY, zajrzyj tutaj, gdzie to wyjaśnimy. 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ą. Ponadto, jeśli chcesz, aby dane były posortowane według roku, użyj ORDER BY rok na końcu zapytania.

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ą (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. Dopasowanie podaży do popytu — rozwiązania, część 2

  2. Praca z danymi Java w Alteryx

  3. Zdecydowanie wpisz te parametry wyceniane w tabeli

  4. Patrząc na wydajność migawki bazy danych

  5. Podłączanie aplikacji 64-bitowej do Acomba