/ / Comment faire une requête d'analyse croisée PostgreSQL il y a des valeurs manquantes dans la colonne - postgresql, postgresql-9.3, postgresql-9.4, postgresql-9.5

Comment faire une requête d'analyse croisée PostgreSQL il y manque des valeurs dans la colonne - postgresql, postgresql-9.3, postgresql-9.4, postgresql-9.5

J'essaie de créer un rapport de délai d'exécutionen utilisant la requête d'analyse croisée PostgreSQL 9.5 où les références sont réparties en jours 1, 2, 3, 4,> 4 (voir le résultat ci-dessous). La requête fonctionne, cependant, si j’exécutais la requête et que les valeurs du jour 2 étaient manquantes, il restait une ligne à gauche. Ainsi, le jour 2 conserve la valeur du jour 3, le jour 3 la valeur du jour 4, etc. .. Quelqu'un peut-il m'aider à garder le jour 2 dans cet exemple vide ou à zéro mais ne pas décaler la rangée?

Merci d'avance.

SCÉNARIO:

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 )

SORTIE:

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

Réponses:

3 pour la réponse № 1

Utilisez la deuxième forme de la fonction 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)