2017-04-07 30 views
-2

這我的查詢,如何在此查詢中簡化?

SELECT item_id,prod_name,closein,closeout,closein-closeout as closing_stock,stockin,closein-closeout+ stockin as current_balnce,stockout, 
closein-closeout+ stockin-stockout as balance,QtyIn,QtyOut 
    FROM (
     SELECT b.prod_name,a.item_id, 
     (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'I' and cast(k.date as date)::date between '2017-03-01' and '2017-04-06' and k.item_id=a.item_id),0)as QtyIn), 
     (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'O' and cast(k.date as date)::date between '2017-03-01' and '2017-04-06' and k.item_id=a.item_id),0)as QtyOut), 
     (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'I' and cast(k.date as date)::date <='2017-02-28' and k.item_id=a.item_id),0)as closein), 
     (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'O' and cast(k.date as date)::date <='2017-02-28' and k.item_id=a.item_id),0)as closeout), 
       (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'I' and cast(k.date as date)::date between '2017-03-01' and '2017-04-06' and k.item_id=a.item_id),0)as stockin), 
     (select COALESCE ((select sum(qty) from stock_leger_head k 
     join mas_prodt_name_hd b ON k.item_id = b.id 
     where k.dept_id=21 and k.flag= 'O' and cast(k.date as date)::date between '2017-03-01' and '2017-04-06' and k.item_id=a.item_id),0)as stockout) 
     FROM stock_leger_head a INNER JOIN 
     mas_prodt_name_hd b ON a.item_id = b.id 
     where a.dept_id=21 
     GROUP BY a.item_id,b.prod_name order by item_id asc 

感謝

+2

用什麼數據庫? MySQL *或* Postgres? – tadman

+0

我正在使用posygres。 –

+0

這裏的標籤非常重要,這就是人們如何找到你的問題。標記爲MySQL是誤導性的。小心並仔細檢查,這有助於保持組織結構。 – tadman

回答

1

等待您的樣本數據,並創建表腳本,我想你可以從像這樣開始:

SELECT C.PROD_NAME, B.* 
    , B.closein - B.closeout AS closing_stock 
    , B.closein - B.closeout + B.stockin AS current_balnce 
    , B.closein - B.closeout + B.stockin - B.stockout AS balance 
FROM 
    (SELECT item_id 
    ,SUM(CASE WHEN flag='I' AND cast(a.DATE AS DATE)::DATE <= '2017-02-28' THEN qty ELSE 0 END) AS closein 
    ,SUM(CASE WHEN flag='O' AND cast(a.DATE AS DATE)::DATE <= '2017-02-28' THEN qty ELSE 0 END) AS closeout  
    ,SUM(CASE WHEN flag='I' AND cast(a.DATE AS DATE)::DATE BETWEEN '2017-03-01' AND '2017-04-06' THEN qty ELSE 0 END) AS stockin 
    ,SUM(CASE WHEN flag='O' AND cast(a.DATE AS DATE)::DATE BETWEEN '2017-03-01' AND '2017-04-06' THEN qty ELSE 0 END) AS stockout 
    ,SUM(CASE WHEN flag='I' AND cast(a.DATE AS DATE)::DATE BETWEEN '2017-03-01' AND '2017-04-06' THEN qty ELSE 0 END) AS QtyIn 
    ,SUM(CASE WHEN flag='O' AND cast(a.DATE AS DATE)::DATE BETWEEN '2017-03-01' AND '2017-04-06' THEN qty ELSE 0 END) AS QtyOut 
    FROM stock_leger_head a 
    WHERE a.dept_id = 21 
    GROUP BY a.item_id 
    ) B 
LEFT JOIN mas_prodt_name_hd C ON B.item_id = C.id 
ORDER BY item_id 
; 
+0

謝謝!你的查詢工作良好非常感謝... –