[英]Subquery “Finding customer who has the most purchases”
我在创建带有子查询的查询时遇到麻烦,无法在数据库中找到购买次数最多的一位客户。 我需要列出他/她的全名,产品名称,价格和数量。 这是我到目前为止的
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,having或where子句中)感到困惑。 我知道有嵌套子查询,相关子查询,多列子查询,多行子查询,单行子查询。 顺便说一下,我正在Oracle中尝试这样做。 这是我的结果图像,除了我从数量列中删除了总和。 另外,更新了链接。
( http://i1294.photobucket.com/albums/b618/uRsh3RRaYm0nD/Capture100_zps1f951b07.jpg )
抱歉,我忘了包含第四个表,因为您可以看到在products表和product type表中有两个名称列。 区别在于产品表中的“名称”是产品的特定名称,如我的链接所示。 产品类型的“名称”列是产品的更通用名称,例如书籍,DVD,CD等。我需要在查询中包括产品类型“名称”列而不是产品的名称列。因此,最终结果应看起来像这样
FullName ProductTypeName Price Quantity
John Brown Book Sumof4books 4
John Brown DVD Sumof2DVDs 2
John Brown Magazine Sumof1Mag 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
对于第二个问题(向客户显示每种产品类型的数量最多的客户,以及他们在该产品类型上花费的金额)
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
这是一般的想法。 您可以将其调整为适合您的数据库表。
select fred, barney, maxwilma
from bedrock join
(select max(wilma) maxwilma
from bedrock
group by fred ) flinstone on wilma = maxwilma
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;
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;
这是您想要的查询
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.