2016-04-21 69 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

这真棒,感谢解决方案,两个解决方案都很棒 –