Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询以查找总购买量最高的客户_Mysql_Sql - Fatal编程技术网

Mysql 查询以查找总购买量最高的客户

Mysql 查询以查找总购买量最高的客户,mysql,sql,Mysql,Sql,我的关系模式如下所示: 现在,我正在尝试编写一个SQL查询,以查找2016年总购买量最高的客户。我想知道客户的姓名和购买总额 Select Customer_name, TotalAmountOfAllHisPurchases from ... 我想不出一个好办法来做这件事。有谁能帮我开始这方面的工作吗?假设totalPurchases为订单总数: SELECT Customer_name, COUNT(o.order_id) as totalPurchases FROM Customer_

我的关系模式如下所示:

现在,我正在尝试编写一个SQL查询,以查找2016年总购买量最高的客户。我想知道客户的姓名和购买总额

Select Customer_name, TotalAmountOfAllHisPurchases from ...

我想不出一个好办法来做这件事。有谁能帮我开始这方面的工作吗?

假设
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, 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分组的订单、订单行和产品表联接在一起,以合计当年的采购总额(订单按合计金额递减)。上一级查询使用内部查询结果,并添加最大采购总额。最外层的查询将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有用。

这个答案将对你有帮助

我的设备中没有安装mysql数据库,所以我使用了在线数据库 在mysql编辑器中自己尝试一下

当我使用TIY编辑器时,我无法更改表名,但我可以找到与您提供的类似的表结构

从客户中选择*------>>>>您的客户 客户ID|| 客户名称

从订单中选择*------>>>您的订单 客户ID|| 订单编号

从orderdetails中选择*您的订单行 医嘱ID|| 产品ID|| 量

从产品中选择*-->>>您的产品 产品ID|| 价格


此查询列出了最大购买量的所有客户的所有客户名称和购买金额

我删除了不兼容的数据库标记。为您实际使用的数据库添加回标记。请添加可能的重复项。使用图像仅为方便补充文本和/或用于无法在文本中给出的内容。不要给出没有图例/键的图表。请阅读并点击谷歌“stackexchange家庭作业”并展示您的尝试。如果不清楚,请道歉。我已经编辑了这个问题。我想找到在购物上花费最多的人。所以你需要在这里加入“单价”。这里使用了两个Group By语句-所以这是正确的一个。第一个是按订单id(1订单id=n个产品(数量*价格)对采购进行求和。第二个是按客户id(1客户=n个订单)对采购进行求和。第三个是仅取最大采购金额(使用订单编号和限额1),并取所有采购总和等于最大值的客户(因为多个客户可以拥有相同的总金额)
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
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)