Отображение нескольких значений столбца в одной строке в PostgreSQL - PullRequest
3 голосов
/ 26 октября 2011

У меня такой запрос:

select to_date(to_char(registime, 'YYYY-MM'),'YYYY-MM') as dt,count(id) as total_call  
from all_info 
where alarm_id is null
group by dt   
order by dt

И результат таков:

dt          total_call      
2011-03-01     45
2011-04-01     61
2011-05-01     62
2011-06-01     41
2011-07-01     48
2011-08-01     42
2011-09-01     28
2011-10-01     39

Я хочу получить результат, как в демонстрационном примере ниже, в виде таблицы:

2011-03-01   2011-04-01  2011-05-01  2011-06-01  ..........
   45            61          62          41

Я хочу использовать кросс-таблицу , но, похоже, она не работает?

1 Ответ

3 голосов
/ 26 октября 2011

Загляните в модуль contrib tablefunc .Он обеспечивает именно ту функциональность сводной таблицы, которую вы ищете.См. Руководство здесь .

Следуйте инструкциям по установке здесь или в статье @Paul Tomblin, предложенной в его комментарии выше.

Тогда ваша функцияможет выглядеть так:

SELECT *
  FROM crosstab($$
SELECT 'total_calls'::text AS col_name
      ,to_char(registime, '"x"YYYY_MM_01') as dt
      ,count(id) as total_call  
FROM   all_info 
WHERE  alarm_id is null
GROUP  BY dt   
ORDER  BY dt
$$)
AS ct(
 call_day text
,x2011_03_01 int8
,x2011_04_01 int8
,x2011_05_01 int8
,x2011_06_01 int8
,x2011_07_01 int8
,x2011_08_01 int8
,x2011_09_01 int8
,x2011_10_01 int8);

Вывод:

  call_day   | x2011_03_01 | x2011_04_01 | x2011_05_01 | x2011_06_01 | x2011_07_01 | x2011_08_01 | x2011_09_01 | x2011_10_01
-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------
 total_calls |           1 |           4 |           4 |           2 |           1 |           5 |           1 |           1

Имена столбцов не могут начинаться с цифры (или вы должны заключать в кавычки), поэтому я поставил дату в началес х.Я также упростил ваш запрос.
Вы можете обернуть это в представление или функцию для многократного использования.
Может быть, функция plpgsql, которая динамически корректирует имена столбцов и ВЫПОЛНИТЬ.объяснение и ссылки в этом связанном ответе .

...