1

スキーマは次のとおりです。

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と、出力には、満足できるすべてではなく、グループ内の最初の顧客のみが表示されます。

4

1 に答える 1

0

質問にどのように答えるかを考えてください。そのような町には、少なくとも2人の顧客が注文しています。このリストは、次の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ような顧客ごとに複数のレコードが存在する可能性があるためです。

これはあなたの質問に答えますが、実際のビジネスニーズには実際には答えません。たとえば、ほとんどの州には「スプリングフィールド」と呼ばれる地域があります。あなたは本当に状態を考慮に入れる必要があります。または、代わりに郵便番号を使用してください。これが実際のビジネス上の質問である場合、ニューヨーク市(「町」フィールドが一貫した値を持っていると仮定して)と言うために出荷する顧客によって圧倒されるでしょう。

于 2013-03-03T20:57:13.877 に答える