2

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

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

SCRIPT:

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 
+0

+ для сценария! – klin

ответ

2

Используйте второй вид функции 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) 
+0

Спасибо, клин! – codeBarer

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