我有3个关于连锁超市的表: 商店(我有商店ID和城市) 客户(我有客户。身份证) 和 购买(我有商店ID,客户ID和每个客户购买的数量)。
我想列出在特定城市的商店购买的每个客户的购买总价值,但该商家信息应包含所有客户名称。
我试着按照以下方式进行:
SELECT customers.cname, SUM(purchases.quantity)
FROM stores LEFT OUTER JOIN purchases ON stores.SID = purchases.Stores AND stores.city = 'Porto'
LEFT OUTER JOIN customers ON customers.CID = purchases.cust
GROUP BY customers.cname;
然而,这只返回在该城市购买的客户,而不是那些没有购买的客户。
我该如何解决这个问题?
谢谢!
编辑:
CNAME SUM(PURCHASES.QUANTITY)
Abel Antunes 3
Berta Borges 13
Carlos Caldas 6
Daniela Dimas 3
Elvira Elvas 14
上面的结果就是使用你的例子(Filipe Silva)表的样子
执行以下声明:
SELECT customers.cname, SUM(purchases.quantity)
FROM stores LEFT OUTER JOIN purchases ON stores.SID = purchases.Stores AND stores.city = 'Porto'
LEFT OUTER JOIN customers ON customers.CID = purchases.cust
GROUP BY customers.cname;
下表中的结果:
CNAME SUM(PURCHASES.QUANTITY)
(null) (null)
Abel Antunes 1
Berta Borges 5
Daniela Dimas 2
代表正确的值,但缺少客户列表的其余部分。 期望的结果应该是:
CNAME SUM(PURCHASES.QUANTITY)
Abel Antunes 1
Berta Borges 5
Carlos Caldas NULL
Daniela Dimas 2
Elvira Elvas NULL
希望这能澄清它!
答案 0 :(得分:1)
试试这个:
SELECT customers.cname,
SUM(purchases.quantity)
FROM customers
LEFT OUTER JOIN purchases ON customers.CID = purchases.cust
LEFT OUTER JOIN stores ON stores.SID = purchases.Stores
AND stores.city = 'Porto'
GROUP BY customers.cname;
您试图吸引客户,但LEFT JOIN
上的左表是stores
,而不是customers
。这样您就可以使用相同的联接,但客户位于LEFT JOIN
的“左侧”。
这可以为您提供所需的信息。
答案 1 :(得分:0)
我得到了答案 - 这个问题实际上已经通过工会解决了:
(SELECT customers.cname, SUM(purchases.quantity)
FROM customers, purchases, stores
WHERE customers.CID = purchases.cust
AND purchases.Stores = stores.SID
AND stores.city = 'Porto'
GROUP BY customers.cname)
UNION
(SELECT customers.cname, NULL
FROM customers,purchases
WHERE customers.CID = purchases.cust
AND customers.CID NOT IN (SELECT purchases.cust
FROM purchases,stores
WHERE purchases.Stores = stores.SID
AND stores.city = 'Porto'));
非常感谢!