【问题标题】:Issue with child table - MySql query子表问题 - MySql 查询
【发布时间】:2017-05-02 04:07:40
【问题描述】:

我的以下查询有问题,销售订单项目是销售订单表中的一个子表,具有多行的那些表(销售订单项目)仅显示第一个项目我的意思是第一行并且所有其他行都没有显示。请给一些小伙伴们一些启发。

select 
 `tabSales Order`.`name` as "Sales Order:Link/Sales Order:120",
`tabSales Order`.`customer` as "Customer:Link/Customer:120",
 `tabSales Order Item`.item_code as "Item:Link/Item:120",
`tabSales Order Item`.item_name as "Des:Link/Item:120",
`tabSales Order Item`.qty as "Qty:Int:100",
 `tabSales Order Item`.delivered_qty as "Delivered Qty:Int:100",
 (`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0)) as "Qty to Deliver:Int:140",
`tabSales Order Item`.date as "Sch date:Date:100",
`tabItem`.thumbnail as "Cut wt:Data:60",
(`tabSales Order Item`.qty * `tabItem`.thumbnail) as "Tonnage:Float:80",
`tabProduct master`.grade as "Grade:Data:100",
`tabProduct master`.dieno as "Die no:Data:100",
`tabProduct master`.hammer as "Hammer:Data:50",
`tabProduct master`.rm_idl_cs as "Idl sec:Data:60",
`tabProduct master`.rm_alt_cs as "Alt sec:Data:60",
ifnull(SUM(CASE WHEN `tabSales Order`.`name` = `tabProduction Order`.`sales_order` and `tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
         THEN `tabProduction Order`.`qty`
    END),0) as "Issued:Int:80",
SUM(CASE WHEN `tabSales Order`.`name` = `tabProduction Order`.`sales_order` and `tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
         THEN `tabProduction Order`.`produced_qty`
    END) as "Cut:Int:80",
(`tabSales Order Item`.qty - ifnull(SUM(CASE WHEN `tabSales Order`.`name` = `tabProduction Order`.`sales_order` and `tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
         THEN `tabProduction Order`.`qty`
    END),0)) as "To be issued:Int:80"

    from  `tabSales Order`
    LEFT JOIN  `tabSales Order Item`  ON ( `tabSales Order Item`.`parent` = `tabSales Order`.`name`
              and  `tabSales Order`.docstatus = 1  )
    LEFT JOIN  `tabItem`  ON `tabItem`.`item_code` = `tabSales Order Item`.`item_code`
    LEFT JOIN  `tabProduct master`  ON `tabProduct master`.`part_no` = `tabSales Order Item`.`item_code`
    LEFT JOIN  `tabProduction Order`
               ON (`tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
              and  `tabSales Order`.`name` = `tabProduction Order`.`sales_order` )
    where  `tabSales Order`.status not in ("Stopped", "Closed", "Completed" )
      and  ifnull(`tabSales Order Item`.delivered_qty,0) < ifnull(`tabSales Order Item`.qty,  0 )
    GROUP BY  `tabSales Order`.`name`
    HAVING  (`tabSales Order Item`.qty -
                SUM(CASE WHEN `tabSales Order`.`name` = `tabProduction Order`.`sales_order`
                      and  `tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
                         THEN `tabProduction Order`.`qty` END)
            ) > 0
      or  (`tabSales Order Item`.qty -
                SUM(CASE WHEN `tabSales Order`.`name` = `tabProduction Order`.`sales_order`
                      and  `tabSales Order Item`.`item_code` = `tabProduction Order`.`production_item`
                         THEN `tabProduction Order`.`qty` END)
            ) is NULL;

【问题讨论】:

  • 看看你是否可以使用HAVING IFNULL( ...-SUM(...) , 1)而不是计算两次。
  • @RickJames。尝试使用 HAVING IFNULL(..) 但问题仍然存在。有什么帮助吗?谢谢
  • 对不起,这只是一个简化建议,不是解决方案。

标签: mysql mariadb


【解决方案1】:

首先,将其缩短以使其更具可读性:

    FROM  `tabSales Order` AS so
    LEFT JOIN  `tabSales Order Item` AS soi
               ON ( soi.`parent` = so.`name`
              AND  so.docstatus = 1  )
    LEFT JOIN  `tabItem` AS i  ON i.`item_code` = soi.`item_code`
    LEFT JOIN  `tabProduct master` AS pm
               ON pm.`part_no` = soi.`item_code`
    LEFT JOIN  `tabProduction Order` AS po
               ON (soi.`item_code` = po.`production_item`
              AND  so.`name` = po.`sales_order` )
    WHERE  so.status NOT IN ("Stopped", "Closed", "Completed" )
      AND  IFNULL(soi.delivered_qty,0) < IFNULL(soi.qty,  0 )
    GROUP BY  so.`name`
    HAVING  IFNULL(soi.qty -
                SUM(CASE WHEN so.`name` = po.`sales_order`
                   AND  soi.`item_code` = po.`production_item`
                         THEN po.`qty` END), 1) > 0

然后进行一些一般性的分析,不一定能解决问题:

  • 你真的需要LEFT吗?也就是说,“正确”表是可选的吗?您想要可能得到的NULLs
  • LEFT JOIN b ON b.x = 1LEFT JOIN b WHERE b.x = 1 之间存在差异。前者可能包含比后者更多的b 行。
  • NULLs 在很多情况下都很好,但如果你能避免它们,SQL 就会变得更简单。

更多

首先在没有“GROUP BY tabSales Order.name”的情况下运行它。你会得到你丢失的线条,但你可能会得到比你想要的更多的东西。如果是这样,那么删除其余的连接,让我们看看我们是否可以在没有项目“内爆”的情况下重新添加它们。

为了帮助理解数据,请说明每个关系是 1:1 还是 1:many 或 many:many。

【讨论】:

  • FWIW,我会选择 's'、'si' 和 'i'
  • 感谢@Rick James 的回复。是的,我知道,但我需要在我的情况下使用 NULL。知道为什么我无法获取子表中的所有行吗?
  • 哪个表是“子表”?
  • 感谢@RickJames 的回复。 tabSales Order Item 是子表。请帮忙 。任何帮助都会真正挽救生命。
  • 看看我添加了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多