【问题标题】:MYSQL - Sum from multiple columns in one table divided by one row in a JOINED other tableMYSQL - 一个表中的多个列的总和除以另一个加入的表中的一行
【发布时间】:2020-02-07 14:41:47
【问题描述】:

我的在线订单有 2 个表格:product_itemsorder

product_item 包含 sales_priceqtycost_price 订单表包括 cost_shippingcurrency

我想获得所有订单的全部 sales_price (* qty) 和 cost_price (* qty) 和 cost_shipping 的总和(按货币分组)

问题在于,当我对 cost_shipping 求和时,它会为订单中的每件商品加起来一个 cost_shipping(因为它们已加入)

因此,如果订单 1 有 2 件商品且 cost_shipping 为 10 欧元,那么它将返回 20 欧元。

如果我不对 cost_shipping 求和,那么我只会得到最后一个值

SELECT 
    currency, 
    SUM(`cost_price` * qty), 
    SUM(`selling_price` * qty), 
    SUM(cost_shipping) 
FROM `product_items` 
INNER JOIN `orders` ON `3xm_orders_new`.id = `3xm_item_sales_new`.order_id 
WHERE `date` >= '2020-02-01' AND `date` < '2020-03-01' 
GROUP BY currency

我需要这些值来锻炼订单的利润。

关于如何实现这一点的任何建议?

提前致谢

温度检测

【问题讨论】:

标签: mysql sql join group-by


【解决方案1】:

您需要先在子查询中汇总每个订单的成本和价格,然后将其与订单连接,然后按货币汇总:

SELECT 
    o.currency, 
    SUM(p.cost_price) sum_cost_price,
    SUM(p.selling_price) sum_selling_price,
    SUM(cost_shipping) sum_cost_shipping
FROM (
    SELECT 
        order_id,
        SUM(cost_price * qty) cost_price, 
        SUM(selling_price * qty) selling_price, 
    FROM product_items 
    GROUP BY order_id
) p
INNER JOIN orders o ON o.id = p.order_id 
WHERE o.date >= '2020-02-01' AND o.date < '2020-03-01' 
GROUP BY o.currency

旁注:

  • 表别名使查询更易于编写、读取和维护;我修改了您的代码以使用它们

  • 总是用它所属的表来限定查询中的每一列;这使得遵循逻辑变得更加容易;我为每一列添加了限定符(我必须做出一些假设,即date 列)

  • 您通常应该避免使用反引号将每个表和列名括起来;仅当标识符包含特殊字符时才需要它们,此处不是这种情况

  • 原始查询中的表名存在差异;我使用了你在问题中描述的那些

【讨论】:

  • 壮观!谢谢!从现在开始,我会将您的笔记记在船上,并尝试将它们合并。
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2015-03-21
  • 2021-03-27
  • 1970-01-01
  • 2015-04-02
  • 2017-02-16
相关资源
最近更新 更多