【问题标题】:SQL - How to SUM and use WHERE clause on this SUM using 4 tables?SQL - 如何使用 4 个表对此 SUM 进行 SUM 和使用 WHERE 子句?
【发布时间】:2016-08-03 08:41:14
【问题描述】:

所以我需要构建一个工具,根据几个参数对我的客户进行排序,然后将其导出为 CSV。 除了我的 SQL 查询(我一直不擅长)之外,一切都运行良好。

这是我的数据库结构:

  • 客户(id、CustomerLogin、CustomerNom、CustomerPrenom、CustomerReference)
  • 订单(OrderId、OrderTotal)
  • 产品(ProductId,类别)
  • OrderProduct(CPId、OrderId、ProductId)

我需要对我的客户进行排序以建立一个邮件列表(CustomerLogin 是一个邮件地址)。 我需要实现的过滤器:

  • 订单号
  • 订单s总数
  • 产品类别

这是我当前的查询(使用一些 php 变量作为总数和类别):

SELECT C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin, O.OrderTotal, O.OrderId  
FROM customers C  
JOIN orders O  
ON C.id = O.CustomerId  
JOIN OrderProduct OP  
ON O.OrderId = OP.OrderId  
JOIN products P  
ON OP.ProduitId = P.ProduitId  
WHERE O.OrderTotal >= $total  
AND P.category IN($product_categories);

所以这会返回订单表中每个客户条目的数据,这些订单按总计和产品类别过滤。 例如:

C.Id, C.ref, C.nom, C.prenom, C.login, O.OrderTotal, O.Id  
1 - REF1 - DOE - John - johndoe@gmail.com - 550 - 1  
1 - REF1 - DOE - John - johndoe@gmail.com - 150 - 4  
1 - REF1 - DOE - John - johndoe@gmail.com - 800 - 8  
5 - REF5 - BOND - James - jb@mi6.com - 007 - 25  
8 - REF8 - ANOTHER - Dude - adude@gmail.com - 50 - 12

我想得到什么:

C.Id, C.ref, C.nom, C.prenom, C.login, OrdersTotal, OrderNumber  
1 - REF1 - DOE - John - johndoe@gmail.com - 1500 - 3  
5 - REF5 - BOND - James - jb@mi6.com - 007 - 1  
8 - REF8 - ANOTHER - Dude - adude@gmail.com - 50 - 1 

问题是我还需要过滤 OrdersTotal 和 OrderNumber,那么如何在“SELECT”中求和并显示,然后在“WHERE”中过滤?这甚至可能吗?我想使用子查询或其他东西,但我很不擅长,所以我可以在这方面使用一些帮助。

抱歉,这个问题太长了,但我需要准确地回答这个问题! 希望你们能理解我的意思并能够帮助我,谢谢!

ps:我已经翻译了我的表名和列名,以便您理解,可能会有一些错误,但它在我这边工作。

更新
感谢Surajit Biswas,这就是解决方案:

SELECT * FROM(    
SELECT C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin, SUM(O.OrderTotal) order_total, COUNT(O.CustomerId) nb_com  
FROM customers C  
JOIN orders O ON C.id = O.CustomerId  
JOIN OrderProduct OP ON O.OrderId = OP.OrderId  
JOIN products P ON OP.ProduitId = P.ProduitId  
WHERE P.category IN($product_categories)  
GROUP BY C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin
)A WHERE A.order_total >= $total AND A.nb_com >= $nbcom

一切正常!
所有学分@Surajit Biswas。

【问题讨论】:

  • 您需要GROUP BY。结合SUM()聚合函数!
  • 感谢 GROUP BY,它将帮助我为每个客户汇总订单!我也在考虑 OrderNumber 的 COUNT() 函数...?

标签: php sql


【解决方案1】:

我会使用这样的东西:

SELECT OrderID, sum(Quantity) as sumquantity
FROM OrderDetails
group by OrderID

当我的表结构是这样的:

OrderDetailID   OrderID ProductID   Quantity
1   10248   11  12
2   10248   42  10
3   10248   72  5
4   10249   14  9
5   10249   51  40
6   10250   41  10
7   10250   51  35

它给我的输出是:

ord_id  sumquantity
10248   27
10249   49
10250   60
10251   41

其实你的情况也很简单...

SELECT C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin,
      SUM(O.OrderTotal) order_total
FROM customers C  
  JOIN orders O  ON C.id = O.CustomerId  
  JOIN OrderProduct OP ON O.OrderId = OP.OrderId  
  JOIN products P ON OP.ProduitId = P.ProduitId
WHERE O.OrderTotal >= $total  
  AND P.category IN($product_categories)
GROUP BY C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin

【讨论】:

  • 我不能真正改变我的数据库结构,因为它是一个已经存在的数据库,有很多条目(大约 20k 个客户、50k 个订单和 3k 个产品)。老实说,我不明白你的结构:p
  • 我根本不是要你改变数据库结构......你可以明白我的意思是什么
  • @Pier,你可以试试这样吗:SELECT C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin, SUM(O.OrderTotal) order_total FROM customers C JOIN orders O ON C.id = O.CustomerId JOIN OrderProduct OP ON O.OrderId = OP.OrderId JOIN products P ON OP.ProduitId = P.ProduitId WHERE O.OrderTotal >= $total AND P.category IN($product_categories) GROUP BY C.id, C.CustomerReference, C.CustomerNom, C.CustomerPrenom, C.CustomerLogin 如果对你有帮助,请接受我的回答为“有帮助”
  • 好的!感谢您的详细询问,我马上测试一下。
  • 所以,我试过了,它似乎在全球范围内工作!但我需要过滤所有订单总数,现在它过滤一个订单总数:WHERE O.OrderTotal >= $total。我会试试这个: WHERE order_total >= $total 编辑:WHERE order_total >= $total 不起作用,我也试过 WHERE (SUM(O.OrderTotal)) >= $total
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 2017-05-20
  • 2018-05-17
  • 2018-12-16
  • 2017-12-17
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多