Как выполнить перекрестный запрос PostgreSQL, если в столбце отсутствуют значения

Я пытаюсь создать отчет о времени оборота, используя перекрестный запрос PostgreSQL 9.5, в котором рефералы разбиты на дни 1, 2, 3, 4, > 4 (см. вывод ниже). Однако у меня есть запрос для работы, если я запустил запрос, а значения дня 2 отсутствовали, вся строка сдвинулась на одну ячейку влево. Таким образом, второй день содержит значение дня 3, день 3 содержит значение дня 4 и т. д. Может ли кто-нибудь помочь мне, как я могу оставить день 2 в этом примере пустым или нулевым, но не сдвигать строку влево?

Заранее спасибо.

СЦЕНАРИЙ:

DROP TABLE IF EXISTS dt_temp;
CREATE TABLE dt_temp(id SERIAL, day int , referrals bigint);

INSERT INTO dt_temp(day, referrals) VALUES(1, 60);
INSERT INTO dt_temp(day, referrals) VALUES(2, 15);
INSERT INTO dt_temp(day, referrals) VALUES (3, 13);
INSERT INTO dt_temp(day, referrals) VALUES (4, 10);
INSERT INTO dt_temp(day, referrals) VALUES (5, 1);
INSERT INTO dt_temp(day, referrals) VALUES (6, 2);
INSERT INTO dt_temp(day, referrals) VALUES (7, 1);
INSERT INTO dt_temp(day, referrals) VALUES (8, 1);

Select * from crosstab(
    $$
    Select 'INDICATOR1' "INDICATOR", days::text, sum(referrals)::text     
from (
      SELECT CASE  
      WHEN day > 4 THEN '>4'
      ELSE day::text
      END "days",
   referrals
   FROM dt_temp
   ) "t"
group by 1,2
order by 2
$$
) AS dx2ref(Indicator text, Day1 text,  Day2 text, Day3 text, Day4 text, "Day > 4" text )

ВЫВОД:

indicator  Day1 Day2 Day3 Day4 Day > 4
--------------------------------------
INDICATOR1 60   15   13   10   5

person codeBarer    schedule 24.05.2016    source источник


Ответы (1)


Используйте вторую форму функции crosstab(text source_sql, text category_sql):

select * from crosstab(
    $$
        select 'INDICATOR1' "INDICATOR", days::text, sum(referrals)::text     
        from (
            select case  
                when day > 4 then '>4'
                else day::text
            end "days",
            referrals
            from dt_temp
            ) "t"
        group by 1,2
        order by 2
    $$,
    $$
        select days from (values ('1'), ('2'), ('3'), ('4'), ('>4')) t(days)
    $$
) AS dx2ref(Indicator text, Day1 text,  Day2 text, Day3 text, Day4 text, "Day > 4" text )


 indicator  | day1 | day2 | day3 | day4 | Day > 4 
------------+------+------+------+------+---------
 INDICATOR1 | 60   | 15   | 13   | 10   | 5
(1 row) 
person klin    schedule 24.05.2016