2

サブクエリを使用してクエリを作成し、DB で最も多くの購入を行った 1 人の顧客を見つけるのに問題があります。氏名、商品名、価格、数量を記載する必要があります。これが私がこれまでに持っているものです

select first_name ||' '|| last_name "FullName", pt.name p.price,  sum(ps.quantity) 
from customers c 
join purchases ps on c.customer_id = ps.customer_id 
join products p on p.product_id = ps.product_id
join product_types pt on p.product_type_id = pt.product_type_id;

これら3つのテーブルを使用する必要があります

顧客表

Customer_ID
First_Name
Last_Name
DOB
Phone

購入表

Product_ID
Customer_ID
Quantity

製品表

Product_ID
Product_Type_ID
Name
Description
Price

製品タイプ表

Product_Type_ID
Name

算術関数を select 外部クエリまたはサブクエリに配置する必要がある場合、サブクエリをどこに配置する必要があるか (select 行、from、having、または where 句) について混乱しています。ネストされたサブクエリ、相関サブクエリ、複数列のサブクエリ、複数行のサブクエリ、単一行のサブクエリがあることは知っています。ちなみに、私はOracleでこれをやろうとしています。これは、数量列から合計を削除したことを除いて、結果の画像です。また、リンクを更新しました。

( http://i1294.photobucket.com/albums/b618/uRsh3RRaYm0nD/Capture100_zps1f951b07.jpg )

申し訳ありませんが、4 番目のテーブルを含めるのを忘れていました。製品テーブルと製品タイプ テーブルに名前の列が 2 つあります。違いは、私のリンクに示されているように、製品テーブルの「名前」が製品の特定の名前であることです。製品タイプの「名前」列は、書籍、DVD、CD など、製品のより一般的な名前です。製品の名前列ではなく、製品タイプの「名前」列をクエリに含める必要があります。したがって、最終結果はこのように見えます

 FullName  ProductTypeName  Price        Quantity    
 John Brown    Book         Sumof4books   4
 John Brown    DVD          Sumof2DVDs    2
 John Brown    Magazine     Sumof1Mag     1
4

4 に答える 4

1

これを行う1つの方法を次に示します。分析関数を使用して、購入の合計数量で顧客を注文しますrow_number() over (order by sum(quantity) desc)。同じ数量の人が複数いる場合、これは 1 つだけを選択します。

次に、この顧客 ID を取得し、残りのテーブルを明白な方法で結合して、製品タイプごとに内訳を取得します。

Select
  c.FullName,
  pt.name,
  Sum(p.price * ps.quantity) price,
  sum(ps.quantity) quantity
From (
  Select
    c.Customer_ID,
    c.first_name ||' '|| c.last_name FullName,
    row_number() over (order by Sum(Quantity) desc) r
  From
    Purchases ps
      Inner Join
    Customers c
      On ps.Customer_ID = c.Customer_ID
  Group By
    c.Customer_ID,
    c.first_name ||' '|| c.last_name
  ) c
    Inner Join
  Purchases ps
    On c.Customer_ID = ps.Customer_ID
    Inner Join
  Products p
    On ps.Product_ID = p.Product_ID
    Inner Join
  Product_Types pt
    On p.Product_Type_ID = pt.Product_Type_ID
Where
  c.r = 1
Group By
  c.FullName,
  pt.name

Example Fiddle

2 番目の問題 (各製品タイプの数量が最も多い顧客と、その製品タイプに費やした金額を表示する)

Select
  c.FullName,
  c.name,
  c.price,
  c.quantity
From (
  Select
    c.first_name ||' '|| c.last_name FullName,
    pt.name,
    sum(p.price * ps.quantity) price,
    sum(ps.quantity) quantity,
    row_number() over (partition by pt.name order by Sum(Quantity) desc) r
  From
    Purchases ps
      Inner Join
    Customers c
      On ps.Customer_ID = c.Customer_ID
      Inner Join
    Products p
      On ps.Product_ID = p.Product_ID
      Inner Join
    Product_Types pt
      On p.Product_Type_ID = pt.Product_Type_ID
  Group By
    c.first_name ||' '|| c.last_name,
    pt.name
  ) c
Where
  c.r = 1

Example Fiddle

于 2013-10-05T23:04:36.420 に答える
0

これが一般的な考え方です。データベーステーブルに合わせて調整できます。

select fred, barney, maxwilma
from bedrock join
(select max(wilma) maxwilma
from bedrock
group by fred ) flinstone on wilma = maxwilma
于 2013-10-05T22:52:43.540 に答える
0
select first_name ||' '|| last_name "FullName",name,quantity from customers,purchases,products where products.product_id = purchases.product_id and purchases.customer_id = customers.customer_id order by quantity;

これはあなたが望むクエリです

于 2016-02-02T04:18:20.513 に答える
0
SELECT CLIENT.CLIENTNO, CLIENT.CNAME, SUM(PURCHASE.AMOUNT) AS AMOUNT
FROM CLIENT
INNER JOIN PURCHASE
ON CLIENT.CLIENTNO = PURCHASE.CLIENTNO
WHERE CLIENT.CLIENTNO IN (
    SELECT CLIENTNO
    FROM (
        SELECT PURCHASE.CLIENTNO, SUM(PURCHASE.AMOUNT) AS AMOUNT
        FROM PURCHASE
        GROUP BY PURCHASE.CLIENTNO
        ORDER BY AMOUNT DESC
    )
WHERE ROWNUM = 1)
GROUP BY CLIENT.CLIENTNO, CLIENT.CNAME;
于 2014-10-07T15:32:57.607 に答える