如何执行 PostgreSQL 交叉表查询列中缺少值
How to do PostgreSQL crosstab query there values are missing in the column
我正在尝试使用 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
使用函数的第二种形式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)
我正在尝试使用 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
使用函数的第二种形式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)