sum

csbfibhn  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(382)

我正在使用php和mysql,我需要对连接3个表的产品总量求和:
订单产品:(表中有多个相同名称但金额不同的订单产品)

order_id        (int)
product_name    (varchar)
product_amount  (int)

订单:

order_id       (int)
order_date     (varchar)
order_status   (varchar)

供应商:

product_name    (varchar)
product_amount  (int)

所以,我想在一行中显示我销售了多少产品,状态是发货的,以及我从供应商那里订购了多少。下面两个例子中的任何一个都能帮助我实现我的目标。
比如:

Product Name     (sum order_products)      (sum supplier)  Order status

first product           300                  2500          Shipped_Only
second product          50                   400           Shipped_Only
third product           10                   600           Shipped_Only

Product Name     (sum order_products)      (sum supplier)  Order status

first product           2200                 2500          Not_Shipped
second product          400                  400           Not_Shipped
third product           590                  600           Not_Shipped

有什么例子或其他帮助,我可以做到这一点?
编辑:示例数据如下
订购产品:

order_id       product_name     product_amount

255               product 1         200
256               product 1         100
257               product 2         50
258               product 3         10

订单:订单号订单日期订单状态

255               09.05.2018         Shipped
256               09.05.2018         Shipped
257               10.05.2018         Not_Shipped
258               10.05.2018         Not_Shipped

供应商:产品名称产品金额

product 1         2500        
product 2         400   
product 3         600
vuv7lop3

vuv7lop31#

据我所知,我认为这是你想要的,如果这不是你所期望的,请澄清。
您将需要使用GROUPBY子句,并且必须使用count()函数来计算GROUPBY子句的结果的行数。我正在写一个如何使用GROUPBY子句的例子,您需要根据需要修改查询。

SELECT
 order_products.product_name,
 count(*) as Total_Orders,
 MAX(supplier.product_amount) as Supplier_Amt,
 orders.order_status
FROM supplier
 INNER JOIN order_products ON supplier.product_name = order_products.product_name
 INNER JOIN orders ON orders.order_id = order_products.order_id
WHERE orders.order_status = 'Not_Shipped'
GROUP BY order_products.product_name, orders.order_status;

您将需要查询,您可以编写另一个,只是替换 WHERE orders.order_status = 'Not_Shipped'WHERE orders.order_status = 'Shipped' 另外,如果希望所有查询都包含在一个查询中,只需删除where子句即可。

kd3sttzy

kd3sttzy2#

您应该在聚合的子选择上使用联接。

SELECT t1.product_name, t1.sum_order_products, t2.supplier_sum, t1.order_status 
FROM (
    SELECT op.product_name, SUM(op.product_amount) sum_order_products, o.order_status
    FROM order_products op
    INNER JOIN orders o ON op.order_id = o.order_id 
    WHERE o.order_status = 'Shipped'
    GROUP BY op.product_name, o.order_status
) t1 
LEFT JOIN (
    SELECT s.product_name, SUM(s.product_amount) supplier_sum
    FROM supplier s 
    GROUP BY s.product_name
) t2 ON t1.product_name = t2.product_name 
ORDER BY t1.order_status, t1.product_name

相关问题