我的关系架构看起来像这样:
现在我正在尝试编写一个SQL查询,以查找2016年总购买量的客户。我想知道客户名称和购买总量。
Select Customer_name, TotalAmountOfAllHisPurchases from ...
我想不出一个干净利落的方式。有谁可以帮我解决这个问题吗?
答案 0 :(得分:1)
假设totalPurchases
为订单总数:
SELECT Customer_name, COUNT(o.order_id) as totalPurchases FROM Customer_t c
LEFT JOIN Order_t o ON o.customer_id = c.customer_id
GROUP BY c.customer_id
编辑:
SELECT Customer_name, SUM(p.unity_price*ol.quantity) as totalPurchases FROM Customer_t c
LEFT JOIN Order_t o ON o.customer_id = c.customer_id
LEFT JOIN Order_Line_t ol ON ol.order_id = o.order_id
LEFT JOIN Product_t p ON p.product_id = ol.product_id
GROUP BY c.customer_id
答案 1 :(得分:1)
我认为以下查询应该可以识别当前日历年中所有订单中金额最高的客户名称:
SELECT CUSTOMER_NAME, Y.QNTY
FROM CUSTOMER_T CUST,
(
SELECT X.CUSTOMER_ID, X.QNTY, MAX(X.QNTY) MAXAMT
FROM (
SELECT ORD.CUSTOMER_ID, SUM(OLN.QUANTITY * PRD.UNIT_PRICE) QNTY
FROM ORDER_T ORD, ORDER_LINE_T OLN, PRODUCT_T PRD
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
AND ORD.ORDER_ID = OLN.ORDER_ID
AND PRD.PRODUCT_ID = OLN.PRODUCT_ID
GROUP BY ORD.CUSTOMER_ID
) X
) Y
WHERE CUST.CUSTOMER_ID = Y.CUSTOMR_ID
AND Y.QNTY = Y.MAXAMT;
最内层查询加入按客户ID分组的ORDER,ORDER_LINE和PRODUCT表,以汇总当前年度的总购买量(按总计金额递减的订单)。一级查询使用内部查询结果,并添加最大总计购买总数。最外层查询将CUSTOMER_T表与内部结果连接起来,以获取与MAXAMT值匹配的所有客户的客户名称和总订单金额。
您可以将日期条件修改为始终限制为2016(无论当前年份如何),如下所示:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
写为:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
您也可以在内部表中拉出CUSTOMER_T的外部查询,并将其添加到连接中。它完成了同样的事情,但我不确定哪个更有效(如果您的数据集很大,则适用)。
注意:从Oracle DB透视图编写,希望这有帮助,您可以转换语法。
编辑:我意识到我的建议会忽略具有相同总支出金额的多个客户。我已经重新设计它以使用MAX并显示多个客户(如果适用)。希望这适用于您的/可以转换为MYSQL。
答案 2 :(得分:0)
这个答案对你有帮助!!!!!!!!!!!!!!!!!!!
我的设备中没有安装mysql数据库所以我使用了ONLINE 在http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
编辑TRY-IT-YOURSELF mysql编辑器当我使用TIY编辑器时,我无法更改表名,但我可以找到与您给出的相似的表结构
CustomerID || 顾客姓名
CustomerID || 订单ID
OrderID || ProductID || 数量
ProductID || 价
with
table1 as (select o.CustomerID, o.orderid,
(
select sum(od.Quantity * p.Price) from orderdetails od, products p
where od.ProductID = p.ProductID and od.orderid = o.orderid group by od.orderid) as total
from orders o group by o.orderid, o.CustomerID )-- having o.CustomerID in(4,10))
select c.CustomerName,sum(t1.total) as total_purchases from table1 t1,customers c
where t1.customerid = c.customerid group by t1.customerid having total_purchases =
(with
table1 as (select o.CustomerID, o.orderid,
(
select sum(od.Quantity * p.Price) from orderdetails od, products p
where od.ProductID = p.ProductID and od.orderid = o.orderid group by od.orderid) as total
from orders o group by o.orderid, o.CustomerID )-- having o.CustomerID in(4,10))
select sum(t1.total) as total_purchases from table1 t1,customers c
where t1.customerid = c.customerid group by t1.customerid order by total_purchases desc
LIMIT 1)
此查询列出了所有客户名称&购买具有最大购买量的所有客户的金额