SQL

PostgreSQL Extensions. С помощью модуля tablefunc получите из таблицы projects базы HR

С помощью модуля tablefunc получите из таблицы projects базы HR таблицу с данными, колонками которой будут: год, месяцы с января по декабрь, общий итог по стоимости всех проектов за год. В качестве ответа на задание пришлите получившийся SQL-запрос.
Для выполнения данной задачи с использованием модуля `tablefunc` в PostgreSQL, можно воспользоваться функцией `crosstab`.

Вот SQL-запрос, который возвращает таблицу с данными по годам, месяцам и общей стоимости всех проектов за каждый год:

```sql
SELECT *
FROM crosstab(
'SELECT year, month, SUM(cost) AS total_cost
FROM projects
GROUP BY year, month
ORDER BY year, month',
'SELECT generate_series(1,12)'
) AS (
year integer,
january numeric,
february numeric,
march numeric,
april numeric,
may numeric,
june numeric,
july numeric,
august numeric,
september numeric,
october numeric,
november numeric,
december numeric
);
```

Обратите внимание, что в данном случае предполагается, что таблица `projects` имеет столбцы `year`, `month` и `cost`, содержащие соответственно год, месяц и стоимость проекта.

Результатом выполнения запроса будет таблица с колонками `year`, `january`, `february`, `march`, `april`, `may`, `june`, `july`, `august`, `september`, `october`, `november`, `december`, где каждая колонка соответствует месяцу, а значения в них - общей стоимости всех проектов за соответствующий месяц каждого года.
Владимир Кобанов
Владимир Кобанов
5 034
Лучший ответ
Евгений Волков не получилось
Для получения таблицы с данными о годе, месяцах и общей стоимости проектов можно использовать следующий SQL-запрос с модулем tablefunc:


SELECT extract(year FROM start_date) AS year,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 1) AS jan,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 2) AS feb,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 3) AS mar,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 4) AS apr,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 5) AS may,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 6) AS jun,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 7) AS jul,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 8) AS aug,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 9) AS sep,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 10) AS oct,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 11) AS nov,
sum(cost) FILTER (WHERE extract(month FROM start_date) = 12) AS dec,
sum(cost) AS total_cost
FROM projects
GROUP BY year
ORDER BY year;


В данном запросе мы используем функцию extract для получения года из столбца start_date, а также фильтр по месяцам (FILTER), чтобы вычислить суммарную стоимость каждого проекта за год. Затем мы группируем результаты по году и сортируем их по возрастанию.

Подразумевается, что модуль tablefunc уже установлен в базу данных PostgreSQL. Если его нет, то необходимо установить его с помощью команды:


CREATE EXTENSION IF NOT EXISTS tablefunc
Dmitry Nazarov
Dmitry Nazarov
1 403