请帮我查询: 我有以下表销售:
customer material week value
customer1 material1 w1 100
customer1 material1 w2 200
customer1 material1 w4 300
customer1 material2 w4 200
表周
week
w1
w2
w3
w4
我需要编写一个返回带有"完成数据"的表的查询。 结果表必须是:
customer material week value
customer1 material1 w1 100
customer1 material1 w2 200
customer1 material1 w3 0
customer1 material1 w4 300
customer1 material2 w1 0
customer1 material2 w2 0
customer1 material2 w3 0
customer1 material2 w4 200
我写这个查询,但我认为这不是最佳的。
select
dict.customer,
dict.material,
weeks.week,
coalesce(sales.value, 0)
from
(select distinct
customer,
material
from
sales) dict
cross join
weeks
left join
sales on dict.customer = sales.customer and
dict.material = sales.material and
weeks.week = sales.week
表格初始化的脚本:
CREATE TABLE public.sales
(
customer character varying(10),
material character varying(18),
week character varying(3),
value numeric
);
CREATE TABLE public.weeks
(
week character varying(3)
);
insert into public.sales (customer, material, week, value)
values ('customer1', 'material1', 'w1', 100),
('customer1', 'material1', 'w2', 200),
('customer1', 'material1', 'w4', 300),
('customer1', 'material2', 'w4', 200);
insert into public.weeks (week)
values ('w1'), ('w2'), ('w3'), ('w4');
谢谢。
答案 0 :(得分:1)
select
customer,
material,
week,
coalesce(sum(value), 0) as value
from
sales
right join (
(
select distinct customer, material
from sales
) s
cross join
weeks
) s using (customer, material, week)
group by 1,2,3
;
customer | material | week | value
-----------+-----------+------+-------
customer1 | material1 | w1 | 100
customer1 | material1 | w2 | 200
customer1 | material1 | w3 | 0
customer1 | material1 | w4 | 300
customer1 | material2 | w1 | 0
customer1 | material2 | w2 | 0
customer1 | material2 | w3 | 0
customer1 | material2 | w4 | 200