这是架构:
customers (customerID: integer, fName: string, lName: string)
items (itemID: integer, description: string, price: float)
orders (orderID: integer, itemID: integer, aID: integer, customerID: integer, date: date)
addresses (aID: integer, housenum: integer, streetName: string, town:string, state: string, zip:integer)
如何列出将物品运送到同一城镇的客户的城镇,名字和姓氏。
当我尝试使用GROUP BY
城镇时,输出只能显示组中的第一个客户,而不是满足所有客户。
答案 0 :(得分:0)
想想你将如何回答这个问题。任何这样的城镇至少有两个客户向它下订单。您可以使用带有having
子句的聚合查询来获取此列表:
select town
from orders o join
addresses a
on o.Aid = a.Aid
group by town
having count(distinct c.customerId) > 1
现在唯一的问题是哪些客户已经向这些城镇下了订单:
select distinct a.town, c.fname, c.lname
from customer c join
orders o
on c.customerID = o.customerID join
Addresses a
on o.Aid = a.Aid
where town in (select town
from orders o join
addresses a
on o.Aid = a.Aid
group by town
having count(distinct c.customerId) > 1
)
第一个选择的distinct
是因为每个这样的客户可能有多个记录。
虽然这回答了你的问题,但它并没有真正满足真正的商业需求。例如,大多数州都有一个名为“斯普林菲尔德”的地方。你真的需要考虑这个州。或者也许使用邮政编码。如果这是一个真正的商业问题,它会被运送到纽约市的客户所淹没(假设“城镇”字段具有一致的价值。