从MySQL查询中获取错误结果

从MySQL查询中获取错误结果,mysql,sql,Mysql,Sql,我正试图通过以下查询获取总购买产品、总销售产品和总销售价格 SELECT products.name, products.code, COALESCE( sum( purchase_items.quantity ) , 0 ) AS purchased, COALESCE( sum( sale_items.quantity ) , 0 ) AS sold, COALESCE(sum(sale_items.gross_total), 0) as sold_price FROM ( `produ

我正试图通过以下查询获取总购买产品、总销售产品和总销售价格

SELECT products.name, products.code, 
COALESCE( sum( purchase_items.quantity ) , 0 ) AS purchased, 
COALESCE( sum( sale_items.quantity ) , 0 ) AS sold,
COALESCE(sum(sale_items.gross_total), 0) as sold_price
FROM ( `products` )
LEFT JOIN `purchase_items` ON `purchase_items`.`product_id` = `products`.`id`
LEFT JOIN `sale_items` ON `sale_items`.`product_id` = `products`.`id`
LEFT JOIN `sales` ON `sale_items`.`sale_id` = `sales`.`id`
LEFT JOIN `purchases` ON `purchase_items`.`purchase_id` = `purchases`.`id`
GROUP BY `products`.`id`
ORDER BY `purchased` DESC
LIMIT 10 

表数据:

NAME            CODE    PURCHASED   SOLD    SOLD_PRICE
test product 3  test3   4           4       1600
test product 2  test2   4           4       2000
test product 1  test1   4           4       1200
我明白了:

test product 1  test1   4   4   1200
test product 3  test3   4   4   1600
test product 2  test2   4   4   2000
这是正确的结果:

test product 1  test1   2   2   400
test product 3  test3   2   2   1200
test product 2  test2   2   2   800

我得到了另一个正确的结果

为了清楚起见,sqlfiddle显示了结果:


虽然您发布的成本/价格/计数与您的sql FIDLE create(可能是复制/粘贴)中的成本/价格/计数不匹配,但我正在尝试了解您想要什么。在过去处理过库存系统和定制后,您试图根据成本和实际销售额找出最受欢迎的产品和/或最有利可图的产品

要解决这个问题,您需要查看您的销售商品成本,以及您为开展业务而花费的所有实际采购项目的总和。同样地,出售的是什么。你可能有100种产品,其中一些永远不会移动,另一些则会大量检查库存。这些实际销售额是另一半。虽然此查询不涉及库存和批次成本分配的后进先出会计方法,但它可能更接近您所寻找的

查询从products表开始,然后左连接到刚购买的总和,左连接到实际销售的总和。我已经从每套中抓取了相应的总数,以便根据您的需要进行处理

此外,我再次计算了毛利作为单个产品的最终成本基础,而不是后进先出法或先进先出法,并表示从实际销售总额中减去产品表中最后已知成本的多少倍。这就给出了仅基于实际销售的毛利润


什么子查询?我看到的只是一些连接。请告诉我们你得到了什么,你期望什么。我已经更新了问题。谢谢您想要获得sumsale_items.gross_total-产品1:400。但是SQLFiddle中的sale_items表包含产品1:2的记录,一个记录的总数为200,另一个记录的总数为400。你能解释一下为什么200+400的和等于400吗?也许我错过了什么。非常感谢你抽出时间。我已经意识到我的错误——sqlfiddle模式的总量是错误的。你能给我推荐一本关于后进先出和先进先出计算方法的书吗。谢谢again@Saleem,后进先出/先进先出应在基本会计账簿中。然而,通常会有一些指标跟踪哪些批次的采购数量,这些指标会进入非常详细的库存跟踪,与您目前拥有的没有任何接近。很抱歉,我不能提供更多关于这个论坛的内容。如果你有兴趣了解更多,以及我在这方面的会计历史,请给我发一封电子邮件。
test product 1  test1   2   2   600
test product 3  test3   2   2   1000
test product 2  test2   2   2   800
SELECT
      p.id,
      p.code,
      p.name,
      COALESCE( PCosts.totalQty, 0 ) as PurchasedQty,
      COALESCE( PCosts.totalDollar, 0 ) as PurchasedCosts,
      COALESCE( PSales.totalQty, 0 ) as SoldQty,
      COALESCE( PSales.totalDollar, 0 ) as TotalSales,
      COALESCE( PSales.totalDollar, 0 ) - ( COALESCE( PSales.totalQty, 0 ) * p.Cost ) as GrossProfit
   from
      products p
         left join ( SELECT
                           pi.product_id,
                           SUM( pi.quantity ) totalQty,
                           SUM( pi.gross_total ) totalDollar
                        from
                           purchase_items pi
                        group by
                           pi.product_id ) PCosts
            ON p.id = PCosts.product_ID
         left join ( SELECT
                           si.product_id,
                           SUM( si.quantity ) as totalQty,
                           SUM( si.gross_total ) as totalDollar
                        from
                           sale_items si
                        group by 
                           si.product_id ) PSales
            ON p.id = PSales.product_id