2017-05-02 14 views
-1

以下のクエリに問題があります。受注明細は受注テーブル内の子テーブルです。複数の行を持つテーブル(受注明細)には、最初の項目は最初の行を意味し、他のすべての行は表示されません。光り輝く少年たちを捨ててください。子テーブルの問題 - MySqlクエリ

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; 
+0

「HAVING IFNULL(...- SUM(...)、1)」を2度計算する代わりに使用できるかどうかを確認してください。 @RickJames。 –

+0

HAVING IFNULL(..)を使用してみましたが、それでも問題は解決しません。どんな助け?ありがとう – Ragav

+0

申し訳ありませんが、それは単なる簡略化の提案であり、解決策ではありません。 –

答えて

0

まず、それを読みやすくするために、それを短縮:

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はより簡単になります。 "tabSales Ordername BY GROUP" せずにそれを実行して

もっと

スタート。あなたは行方不明を得るでしょうが、あなたが望む以上に多くを得るかもしれません。その場合は、残りの結合を削除し、項目の「内在」なしでそれらを追加できるかどうかを見てみましょう。

データの理解を助けるために、それぞれの関係が1:1か1:多か多:多かどうかを言ってください。

+0

FWIW、私は 's'、 'si'、 'i'と一緒に行きます – Strawberry

+0

返信@Rick Jamesに感謝します。はい私は知っているが、私は自分の状況でNULLを持つ必要があります。なぜ私は子テーブルのすべての行を取得することができないのですか? – Ragav

+0

どのテーブルが「子テーブル」ですか? –