【问题标题】:Subquery "Finding customer who has the most purchases"子查询“查找购买最多的客户”
【发布时间】:2013-10-12 18:15:02
【问题描述】:

我在创建带有子查询的查询以查找我的数据库中购买次数最多的一位客户时遇到了问题。我需要列出他/她的全名、产品名称、价格和数量。这是我到目前为止所拥有的

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;

我需要用到这三个表

客户表

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

如果算术函数应该放置在选择外部查询或子查询中,我很困惑我应该将子查询放在哪里(在选择行、from、have 或 where 子句中)。我知道有嵌套子查询、相关子查询、多列子查询、多行子查询、单行子查询。顺便说一句,我正在尝试在 Oracle 中执行此操作。 这是我的结果的图像,除了我从数量列中删除了总和。另外,更新链接。

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

抱歉,我忘记包含第四个表,您可以看到产品表和产品类型表中有两个名称列。不同之处在于产品表中的“名称”是产品的具体名称,如我的链接所示。产品类型“名称”列是产品的更通用名称,例如书籍、dvds、cds 等。我需要在我的查询中包含产品类型“名称”列而不是产品名称列。因此,最终结果应该看起来像这样

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

【问题讨论】:

  • 您需要更具体。添加一些测试数据和预期答案。您是否正在为购买最多该产品的每种产品寻找一位客户?无论产品如何,在所有购买中拥有最高数量的单个客户?还有什么?

标签: sql oracle


【解决方案1】:

这是一种方法。它使用分析函数按购买总量订购客户:row_number() over (order by sum(quantity) desc)。如果有多个相同数量的人,这将只挑出一个。

然后,它会获取此客户 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

对于第二个问题(显示每种产品类型数量最多的客户,以及他们在该产品类型上的花费)

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

【讨论】:

  • 我收到“行错误:27 列:3 表或视图不存在”消息。
  • 查看第 27 行,注意我拼错了表名,修复它。
  • 是的,非常感谢。是否可以将其他产品类型(DVD、VIDEO 等)数量最多的客户包含在书籍的当前结果中?我想补偿您的时间,您的 PayPal 电子邮件是什么?谢谢。
【解决方案2】:

这是一般的想法。您可以根据您的数据库表对其进行调整。

select fred, barney, maxwilma
from bedrock join
(select max(wilma) maxwilma
from bedrock
group by fred ) flinstone on wilma = maxwilma

【讨论】:

    【解决方案3】:
    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;
    

    【讨论】:

      【解决方案4】:
      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;
      

      这是你想要的查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多