使用group by SQL显示所有值

时间:2013-03-03 20:49:18

标签: sql group-by

这是架构:

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城镇时,输出只能显示组中的第一个客户,而不是满足所有客户。

1 个答案:

答案 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是因为每个这样的客户可能有多个记录。

虽然这回答了你的问题,但它并没有真正满足真正的商业需求。例如,大多数州都有一个名为“斯普林菲尔德”的地方。你真的需要考虑这个州。或者也许使用邮政编码。如果这是一个真正的商业问题,它会被运送到纽约市的客户所淹没(假设“城镇”字段具有一致的价值。