Извлечение данных из БД с помощью WHERE и AS - PullRequest
0 голосов
/ 23 мая 2018

У меня есть таблица с данными моделирования для зданий разных лет, где каждый год имеет одну строку.Заголовки столбцов:

id / year / avg_heat_demand / renovation_level / co2_emission / [and some more]

Теперь я хочу создать таблицу с только avg_heat_demand в течение нескольких лет в качестве кулона, например

id / avg_heat_demand_2015 / avg_heat_demand_2025 / avg_heat_demand_2050

Я знаю, что хочу сказать, ноЯ не могу поставить SQL-операторы в правильном порядке, я думаю.Я пытался, например, (я знаю, что это не правильный путь, но он может лучше объяснить, что я хочу сделать):

CREATE TABLE output_time AS

SELECT id, 
       year, 
       (avg_heat_demand WHERE year = 2015) AS avg_heat_demand_m2_2015, 
       (avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2025, 
       (avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2050 
FROM simulation_output;

пример данных:

id | year | avg_heat_demand | etc
----+-----+-----------------+----
11 | 2015 | 55              +
12 | 2015 | 40              +
11 | 2016 | 48              +
12 | 2016 | 49              +
11 | 2025 | 45              +
12 | 2025 | 43              +
11 | 2050 | 50              +
12 | 2050 | 52              +

результат, который яхочу:

id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050 
---+----------------------+----------------------+---------------------
11 | 55                   | 45                   | 50
12 | 40                   | 43                   | 52

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я знаю, что нашел средство с функцией кросс-таблицы:

SELECT * 
FROM crosstab('select id, year, avg_heat_demand FROM simulation_output order by 1,2') 
AS final_result(id character varying, avg_heat_demand_m2_2015 double precision, avg_heat_demand_m2_2025 double precision, avg_heat_demand_m2_2050 double precision);

, как описано на http://www.vertabelo.com/blog/technical-articles/creating-pivot-tables-in-postgresql-using-the-crosstab-function

0 голосов
/ 23 мая 2018

На основании этих данных:

 id | avg_heat_demand | year 
----+-----------------+------
 11 |              55 | 2015
 12 |              40 | 2015
 11 |              45 | 2025
 12 |              43 | 2025
 11 |              50 | 2050
 12 |              52 | 2050
(6 Zeilen)

Попробуйте использовать подзапросы:

SELECT
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2015) AS avg_2015,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2025) AS avg_2025,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2050) AS avg_2050;

      avg_2015       |      avg_2025       |      avg_2050       
---------------------+---------------------+---------------------
 47.5000000000000000 | 44.0000000000000000 | 51.0000000000000000
(1 Zeile)

Если вы можете позволить себе результаты в нескольких строках, попробуйте следующий запрос:

SELECT year,AVG(avg_heat_demand)
FROM simulation_output
GROUP BY year
ORDER BY year

 year |         avg         
------+---------------------
 2015 | 47.5000000000000000
 2025 | 44.0000000000000000
 2050 | 51.0000000000000000
(3 Zeilen)

РЕДАКТИРОВАТЬ : на основе редактирования ОП (другой желаемый формат вывода)

SELECT DISTINCT i.id, 
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2015 AND j.id = i.id) AS avg_heat_demand_2015,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2025 AND j.id = i.id) AS avg_heat_demand_2025,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2050 AND j.id = i.id) AS avg_heat_demand_2050
FROM simulation_output i

 id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050 
----+----------------------+----------------------+----------------------
 11 |                   55 |                   45 |                   50
 12 |                   40 |                   43 |                   52
(2 Zeilen)
...