2015-08-04 2 views
0

Вот мой SQLMysql Условная сумма

SELECT A.item_code,A.description,A.uom, A.open_stock, B.recd_total, C.issue_qty 
FROM chem_master as A 
     LEFT JOIN ( 
       SELECT item_code, SUM(recd_qty) as recd_total 
       FROM chem_receipts 
       GROUP BY item_code) AS B 
      ON A.item_code=B.item_code 
     LEFT JOIN(
       SELECT item_code, sum(iss_qty) as issue_qty 
       FROM chem_issue 
       GROUP BY item_code) as C 
      ON A.item_code=C.item_code 
HAVING (open_stock+recd_total-issue_qty) IS NULL OR (open_stock+recd_total-issue_qty)=0 

Здесь таблица chem_receipts & chem_issue не все совпадающие записи в chem_master. Кроме того, может быть несколько совпадающих записей.

Я хочу показать предметы, где есть 0. В chem_master 300 предметов. Но только 15 записей в chem_receipts, так как у нас была дополнительная покупка только в этих 15 предметах. В chem_issue есть 100 записей.

Теперь в запрошенном запросе на предметы, где не производится никакая дополнительная покупка, отображается как NULL & то же самое, когда элемент никогда не выпускается.

Я понимаю, что добавление записей всех элементов с количеством «0» в количестве в таблице выпуска и получения позволит решить проблему. Но это не лучший метод.

Как я могу улучшить этот запрос?

ответ

0

Вы получаете отдавали различие между числовым 0 и NULL. Вы очень близки к правильному ответу.

Если бы я был вами, имея 300 предметов, я бы начал с нефильтрованного запроса, показывающего запас для каждого предмета.

SELECT A.item_code,A.description,A.uom, 
     A.open_stock, 
     IFNULL(B.recd_total,0) recd_total, 
     IFNULL(C.issue_qty,0) issue_qty 
FROM chem_master as A 
LEFT JOIN ( 
      SELECT item_code, SUM(recd_qty) as recd_total 
      FROM chem_receipts 
      GROUP BY item_code) AS B 
     ON A.item_code=B.item_code 
LEFT JOIN(
      SELECT item_code, sum(iss_qty) as issue_qty 
      FROM chem_issue 
      GROUP BY item_code) as C 
     ON A.item_code=C.item_code 

Обратите внимание на IFNULL() операции поворота Нулевых результатов ваших LEFT JOIN промахов в числовое 0 значения. (COALESCE() также работает для этого.)

Затем используйте это как подзапрос для основного запроса, который выполняет вашу фильтрацию.

SELECT item_code, description, uom, 
     open_stock, recd_total, issue_qty, 
     open_stock+recd_total-issue_qty in_stock_qty 
    FROM (
     SELECT A.item_code,A.description,A.uom, 
       A.open_stock, 
       IFNULL(B.recd_total,0) recd_total, 
       IFNULL(C.issue_qty,0) issue_qty 
     FROM chem_master as A 
     LEFT JOIN ( 
        SELECT item_code, SUM(recd_qty) as recd_total 
         FROM chem_receipts 
        GROUP BY item_code) AS B 
       ON A.item_code=B.item_code 
     LEFT JOIN(
        SELECT item_code, sum(iss_qty) as issue_qty 
         FROM chem_issue 
        GROUP BY item_code) as C 
       ON A.item_code=C.item_code 
) DETAIL 
WHERE (open_stock+recd_total-issue_qty) = 0 
+0

Спасибо, мистер Джонс ... это то, что я хотел сделать. – mansoondreamz

0

Я думаю, что вы просто хотите COALESCE():

SELECT A.item_code, A.description, A.uom, A.open_stock, 
     COALESCE(B.recd_total, 0) as recd_total, 
     COALESCE(C.issue_qty, 0) as issue_qty 
FROM . . .