Загляните в модуль 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, которая динамически корректирует имена столбцов и ВЫПОЛНИТЬ.объяснение и ссылки в этом связанном ответе .