从MySQL查询中获取错误的结果

时间:2013-12-18 15:28:24

标签: 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 ( `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 

SQLFiddle Link

表格数据:

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

2 个答案:

答案 0 :(得分:1)

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

为了清楚说明,sqlfiddle显示结果:)

http://sqlfiddle.com/#!2/44e19/38

test product 1  test1   2   2   600
test product 3  test3   2   2   1000
test product 2  test2   2   2   800

答案 1 :(得分:1)

虽然您的发布成本/价格/数量似乎与您的sql小提琴创建(可能是复制/粘贴)相匹配,但我正在尝试了解您想要的内容。处理过库存系统(并在过去定制)后,您正在尝试根据成本与实际销售情况找出最受欢迎的产品和/或最有利可图的产品。

要解决此问题,您需要查看您的商品销售成本(所有实际购买商品的总和)。然后类似地,出售什么。你可能拥有100个产品,其中一些产品从未移动过,其他产品则经常进入库存。这些实际销售额是另一半。虽然此查询不涉及LIFO / FIFO会计方法的库存和批次成本分配,但它可能更接近您所寻找的。

查询从产品表开始,然后左连接到刚购买的总和,左连接到实际销售的总和。我已经根据你的需要从每一组中获取了相应的总数。

此外,我已经计算出GROSS PROFIT作为单个产品的最终成本基础(同样,不是LIFO或FIFO方法),并且从总实际销售额中说,减去了最后已知数量的TIMES数量。产品表中的成本。这使得毛利仅基于实际销售的那些。

SQL Fiddle Results

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