2016-04-21 67 views
1

我有2個表,其由一組數據如下的和我想要得到的結果,作爲其結果將有一個計算在現場balanceMySQL的垂直水平和與垂直總和在同一時間

我我卡在balance字段,我如何獲得balance正在運行?

tblIn

in_date | code | in_qty 
-----------|---------|--------- 
2016-04-01 | aaa  | 100 
2016-04-03 | aaa  | 200 
2016-04-06 | aaa  | 400 

tblOut

out_date | code | out_qty 
-----------|---------|--------- 
2016-04-02 | aaa  | 100 
2016-04-08 | aaa  | 400 

RESULT

date  | code | in_qty | out_qty | balance 
-----------|---------|----------|----------|--------- 
2016-04-01 | aaa  | 100  | 0  | 100 
2016-04-02 | aaa  | 0  | 100  | 0 
2016-04-03 | aaa  | 200  | 0  | 200 
2016-04-06 | aaa  | 400  | 0  | 600 
2016-04-08 | aaa  | 0  | 400  | 200 

QUE RY

SELECT 
    t.date, 
    t. CODE, 
    t.in_qty, 
    t.out_qty 
FROM 
    (
     SELECT 
      date, 
      in_qty, 
      0 AS out_qty 
    FROM tblIn 
     UNION ALL 
     SELECT 
      date, 
      0 AS in_qty, 
      out_qty 
     FROM tblOut 
    ) t 
ORDER BY date ASC 
+0

您可以用'union' – Blank

+0

對不起,也許我的問題是不是太清楚,我有更新,我要實現 –

+0

或許更具體的事情你''out_qty' out_date' 2016年4月8日的是400;) – Blank

回答

0

你可以試試這個查詢:

SELECT 
t.*, 
@prevBalance := (t.in_qty - t.out_qty) + IFNULL(@prevBalance,0) AS balance 
FROM 
(
    SELECT 
     in_date date, 
     code, 
     in_qty, 
     0 AS out_qty 
    FROM tblin 

    UNION 

    SELECT 
     out_date, 
     code, 
     0, 
     out_qty 
    FROM tblout 
) t , (SELECT @prevBalance := NULL) var 
ORDER BY t.date; 

SQL FIDDLE DEMO

注:

如果初始化@prevBalancezero然後IFNULL(@prevBalance,0)變量不再需要。

所以如果你使用這樣的:

(SELECT @prevBalance := 0) var

然後更改餘額列象下面這樣:

@prevBalance := (t.in_qty - t.out_qty) + @prevBalance

+0

magic發生了,謝謝 –

+0

不客氣:) – 1000111

1

嗯,讓我們像這樣做;)

CREATE TABLE IF NOT EXISTS `tblIn` (
    `in_date` date DEFAULT NULL, 
    `code` char(50) DEFAULT NULL, 
    `in_qty` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `tblOut` (
    `out_date` date DEFAULT NULL, 
    `code` char(50) DEFAULT NULL, 
    `out_qty` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

然後嘗試這個,也許工作;)

SELECT TMP.date, TMP.code, TMP.in_qty, TMP.out_qty, @BALANCE:[email protected] + TMP.BALANCE AS balance 
FROM (
    SELECT out_date as date, 
      code, 
      0 as in_qty, 
      out_qty, 
      0-out_qty as balance 
    FROM tblOut 
    UNION 
    SELECT in_date as date, 
      code, 
      in_qty, 
      0 as out_qty, 
      in_qty as balance 
    FROM tblIn) TMP, 
    (SELECT @BALANCE:=0) B 
ORDER BY TMP.date 
+0

這真棒,感謝解決方案,兩個解決方案都很棒 –