【问题标题】:MySQL subquery result with joins and grouping带有连接和分组的 MySQL 子查询结果
【发布时间】:2016-06-26 08:03:20
【问题描述】:

我无法让 mySQL 返回我所追求的结果,因此希望有人能给我一些关于我哪里出错的指示。我有 3 个表(Sales_Area、Orders、Rooflight_Request),订单包含一个 Sales_Area_ID 列以加入 Sales_Area,因此 Sales_Area 可以有很多订单。 Rooflight_Request 包含 Order_ID,因此一个订单可以有多个 Rooflight_Request。

Rooflight_Request 包含产品,我正在尝试对按销售区域分组的订单中的屋顶灯总数(公式考虑价格、折扣、汇率和数量)求和。

当我运行这个查询时:

    SELECT salesArea.Area_Name,
(SELECT SUM(((rr.Price - (rr.Price * (rr.Discount /100))) / orders.Currency_Rate) * rr.Quantity) 
    FROM Rooflight_Request AS rr
    WHERE rr.Order_ID = orders.Order_ID
    AND rr.Record_Active = 1 
    AND rr.Alternative_Option <> 1
) AS Rooflights_Total
FROM Sales_Area AS salesArea
    LEFT JOIN Orders AS orders ON
        salesArea.Sales_Area_ID = orders.Sales_Area_ID
    LEFT JOIN Users AS users ON
        salesArea.User_ID = users.User_ID
GROUP BY salesArea.Area_Name

结果是按销售区域分组的,但我只得到一个有价值的订单。如果我将 group by 交换为 orders.Order_ID,则结果集包含所有订单和产品,但返回数千条记录,因为它没有按销售区域分组。谁能告诉我哪里出错了?谢谢。

【问题讨论】:

  • 您到底想得到什么?每组一行??
  • 你能添加表模式和预期结果集吗?它会帮助其他人帮助你
  • 我试图实现的结果集是每个 Sales_Area(例如美国和欧洲)的一行,每行包含一个 Rooflights_Total 金额(它将所有订单中的所有屋顶灯(产品)加起来附于该销售区域)。通过上面的查询,我只能从一个订单中得到总数。如果我将组交换为 order_ID,然后每个订单都有一行,每个订单都有自己的总数。所以我需要将所有这些订单加在一起,并将它们分组到他们的销售区域下。
  • 嗨 Mahesh 我会去研究如何在这里添加架构,因为这不是我以前做过的事情。我曾希望虽然我们只谈论 3 张桌子,但我可以解释一下。 Sales_Area 一对多订单和订单一对多 Rooflight_Request。我希望将屋顶灯总数分组在 salesArea 下

标签: mysql


【解决方案1】:

试试这个吧

SELECT SA.Area_Name ,SUM(((RR.Price - (RR.Price * (RR.Discount /100))) / O.CuRRency_Rate) * RR.Quantity) FROM Sales_Area SA INNER JOIN 订单 O ON SA。 Sales_Area_ID = O.Sales_Area_ID INNER JOIN Rooflight_Request RR ON RR.Order_ID = O.Order_ID WHERE RR.Record_Active = 1 AND RR.Alternative_Option 1 GROUP BY SA.Area_Name;

【讨论】:

  • 太棒了,谢谢,我把它放进去,我得到了我现在想要的结果,我可以在使用这种安排时添加其他部分,真的很有帮助!
  • np 如果您需要任何帮助,请告诉我
【解决方案2】:

看着你的查询结构,我认为总的子选择不正确..你应该(我的意见)尝试将 rr 与其他表一起加入

SELECT  salesArea.Area_Name, SUM(((rr.Price - (rr.Price * (rr.Discount /100))) / orders.Currency_Rate) * rr.Quantity) 
FROM FROM Rooflight_Request AS rr
INNER JOIN Orders ON r.Order_ID = orders.Order_ID
LEFT JOIN Orders AS orders ON
    salesArea.Sales_Area_ID = orders.Sales_Area_ID
LEFT JOIN Users AS users ON
    salesArea.User_ID = users.User_ID
WHERE rr.Record_Active = 1 
    AND rr.Alternative_Option <> 1
GROUP BY salesArea.Area_Name

【讨论】:

  • scaisEdge 谢谢你,这真的很有用。现在的问题是我简化了这个问题,所以我可以在写它的时候尝试并理解它。我还有其他产品表,例如Extras_Request。我需要结果中这些其他表的总数。因此,如果我交换查询轮以进入第一个产品表 (Rooflight_Request),我就无法将其他产品总数纳入结果。我应该把它放在最初的问题中,我想在有人帮助提出这个概念后,我可以在自己身上添加这些内容。当然,这种解决方案并非如此。
  • @scaisEdge 为什么要将结果与用户表连接。他们不依赖于此,它会添加不需要的连接?
  • 嗨 Mahesh,在用户表和其他一些表上有条件,我正在简化我被困在该区域的部分。你给出的答案让我现在把它全部放进去谢谢
猜你喜欢
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多