我是新手。
我正在使用PostgreSQL来处理我特定研究领域的大量数据。不幸的是,我遇到了一个不允许我继续分析的问题。我试图简化我的问题以清楚地说明它。
假设我有一张名为"买家"这些数据: table_buyers
买家只能在每家商店购买一件商品,或者不购买。有三家商店,每个商店都有一张桌子。如下所示:
要创建表,我使用以下代码:
CREATE TABLE public.buyer
(
ID integer NOT NULL PRIMARY KEY,
name text NOT NULL,
phone text NOT NULL
)
WITH (
OIDS = FALSE
)
;
CREATE TABLE public.Store1
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL,
total_itens integer NOT NULL
)
WITH (
OIDS = FALSE
)
;
CREATE TABLE public.Store2
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL,
total_itens integer NOT NULL
)
WITH (
OIDS = FALSE
)
;
CREATE TABLE public.Store3
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL,
total_itens integer NOT NULL
)
WITH (
OIDS = FALSE
)
;
要在表格上添加信息,我使用以下代码:
INSERT INTO buyer (ID, name, phone) VALUES
(1, 'Alex', 88888888),
(2, 'Igor', 77777777),
(3, 'Mike', 66666666);
INSERT INTO Store1 (ID_buyer, total_order, total_itens) VALUES
(1, 87.45, 8),
(2, 14.00, 3),
(3, 12.40, 4);
INSERT INTO Store2 (ID_buyer, total_order, total_itens) VALUES
(1, 785.12, 7),
(2, 9874.21, 25);
INSERT INTO Store3 (ID_buyer, total_order, total_itens) VALUES
(2, 45.87, 1);
由于所有表都按买方的ID互连,我希望我能有一个生成输出的查询,如下所示: desired output table
请注意,如果买家没有在商店购买任何东西,我必须打印' 0'
我知道这是一项轻松的任务,但不幸的是,我一直未能完成它。
使用' AND'逻辑运算符,我尝试了以下代码来完成此任务:
SELECT
buyer.id,
buyer.name,
store1.total_order,
store2.total_order,
store3.total_order
FROM
public.buyer,
public.store1,
public.store2,
public.store3
WHERE
buyer.id = store1.id_buyer AND
buyer.id = store2.id_buyer AND
buyer.id = store3.id_buyer;
但是,显然,它刚刚回归'伊戈尔'因为这是在所有三家商店(print screen)购买商品的唯一买家。
然后,我尝试了' OR'逻辑运算符,就像下面的代码一样:
SELECT
buyer.id,
buyer.name,
store1.total_order,
store2.total_order,
store3.total_order
FROM
public.buyer,
public.store1,
public.store2,
public.store3
WHERE
buyer.id = store1.id_buyer OR
buyer.id = store2.id_buyer OR
buyer.id = store3.id_buyer;
但是,它会返回12行错误值(print screen)。
显然,我的错误在于不考虑买家'不要在我的代码上的所有三个商店。我不能自己纠正它,你能帮助我吗?
我非常感谢能够照亮我的方式的答案。非常感谢!
我也非常欢迎有关如何搜索此问题的提示!
答案 0 :(得分:0)
确定。我怀疑这是你的最终答案,但它是一个开始
SELECT
buyer.id,
buyer.name,
COALESCE( gb_store1.total_orders, 0 ) as store1_total,
COALESCE( gb_store2.total_orders, 0 ) as store2_total,
COALESCE( gb_store3.total_orders, 0 ) as store3_total
FROM
public.buyer,
LEFT OUTER JOIN ( SELECT ID_buyer,
SUM( total_orders ) as total_orders,
SUM( total_itens ) as total_itens
FROM public.store1
GROUP BY ID_buyer ) gb_store1 ON gb_store1.id_buyer = buyer.id ,
LEFT OUTER JOIN ( SELECT ID_buyer,
SUM( total_orders ) as total_orders,
SUM( total_itens ) as total_itens
FROM public.store2
GROUP BY ID_buyer ) gb_store2 ON gb_store2.id_buyer = buyer.id ,
LEFT OUTER JOIN ( SELECT ID_buyer,
SUM( total_orders ) as total_orders,
SUM( total_itens ) as total_itens
FROM public.store3
GROUP BY ID_buyer ) gb_store3 ON gb_store3.id_buyer = buyer.id ;
所以,这个查询有几个应该关注的元素。子选择/ groupby允许您通过ID_buyer在子表中进行总计。 LEFT OUTER JOIN使它成为您的查询仍然可以返回结果,即使子查找没有找到匹配的记录。最后,当你的一个总数为NULL时,COALESCE允许你返回0(因为子选择找不到匹配)。
希望这有帮助。