2015-10-16 2 views
0

У меня есть мнение, возвращающих таблицу, как это:PostgreSQL. Получение значения из строк и изменить строки в столбцы

cat_name | Jan | Feb | Mar | ... | YEAR 
student | 0 | 23 | 12 | ... | 2013 
student | 10 | 2 | 8 | ... | 1999 
professor| 12 | 9 | 3 | ... | 2015 
teacher | 3 | 8 | 5 | ... | 2015 

мне нужно сделать вид, возвращающих л, как это:

cat_name | 1999 | 2013 | 2015 | ... 
student | 20 | 35 | 0 | ... 
professor| 0 | 0 | 24 | ... 
teacher | 0 | 0 | 16 | ... 

Sum строки и выберите distinct cat_name:

SELECT cat_name, "YEAR", 
    COALESCE("Jan",0)+COALESCE("Feb",0)+COALESCE("Mar",0)+ 
    ... +COALESCE("Dec",0) AS sum 
FROM view 
GROUP BY "YEAR", cat_name, sum; 

Есть ли способ сделать имена столбцов «YEAR»? Количество лет не фиксировано и количество cat_name тоже. Как я могу сделать некоторый список с да (от select distinct "YEAR" from view), например, и использовать эти годы вместо 2013, 2014 ... в CASE WHEN "YEAR" = 2014?

+0

Результат выбора имеет фиксированное количество столбцов - независимо от данных таблицы. – jarlh

ответ

0

Вы можете сделать это с помощью условной агрегации:

SELECT cat_name, "YEAR", 
     SUM(CASE WHEN "YEAR" = 2013 
       THEN COALESCE("Jan", 0) + COALESCE("Feb", 0) + COALESCE("Mar", 0)+ . . . 
      END) as "2013", 
     SUM(CASE WHEN "YEAR" = 2014 
       THEN COALESCE("Jan", 0) + COALESCE("Feb", 0) + COALESCE("Mar", 0)+ . . . 
      END) as "2014", 
     . . . 
FROM view 
GROUP BY cat_name; 

Если вам нужно переменное число столбцов в вашем выводе, то вы можете использовать crosstab запрос. Here - пример.

+0

Как я могу сделать некоторый список с yas из ('select different" YEAR "from view'), например, и использовать эти годы вместо 2013, 2014 ... в' CASE WHEN "YEAR" = 2014'? – Svetlana

Смежные вопросы