1

MySQLには大量のデータを持つ2つのテーブルがあります。2つの列を減算し、生成された列の合計を表示したい...

これが私が持っているものです

CREATE TABLE fin_invoice(
id MEDIUMINT NOT NULL AUTO_INCREMENT,
invoice_no INT,
total INT,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO fin_invoice (`id`, `invoice_no`, `total`) VALUES (NULL, '1000', '1000'),
(NULL, '1001', '2000'),(NULL, '1002', '3000'),(NULL, '1003', '1200'),(NULL, '1004',     '2000'),
(NULL, '1005',   '1202'),(NULL, '1006', '220');

表2は

CREATE TABLE fin_money(
id MEDIUMINT NOT NULL AUTO_INCREMENT,
fk_invoice INT,
amount INT,
PRIMARY KEY (id)
) ENGINE=MyISAM;

INSERT INTO `fin_money` (`id`, `fk_invoice`, `amount`) VALUES (NULL, '1', '100'),
(NULL, '2', '200'),(NULL, '3', '300'),(NULL, '4', '500'),(NULL, '5', '600'),
(NULL, '6',   '800'),(NULL, '7', '50');

テーブル2(fin_money)は外部キーfk_invoice.soでtable1(fin_invoice)に接続されているため、関係はfin_invoice.id=fin_money.fk_invoiceです。

これを手に入れたい

+----+-------------+--------+------+---------+
| id |  total      | amount | bal  | running |
+----+-------------+--------+------+---------+
|  1 |        1000 |    100 |  900 |     900 |
|  2 |        2000 |    200 | 1800 |    2700 |
|  3 |        3000 |    300 | 2700 |    5400 |
|  4 |        1200 |    500 |  700 |    6100 |
|  5 |        2000 |    600 | 1400 |    7500 |
|  6 |        1202 |    800 |  402 |    7902 |
|  7 |         220 |     50 |  170 |    8072 |
+----+-------------+--------+------+---------+

ここで、bal = total-amount and runningは、前のidのbalとrunningの合計です。900+ 0=900や1800+900=2700などです。

4

1 に答える 1

3

これは、ローカル変数を使用して現在の合計を作成する必要があります。

SELECT fi.id, 
  fi.total, 
  fm.amount,
  fi.total-fm.amount bal,
  @runTotal:=@runTotal+fi.total-fm.amount runTotal
FROM fin_invoice fi 
  JOIN fin_money fm ON fi.id = fm.fk_invoice
  JOIN (SELECT @runTotal:= 0) r;

これがSQLフィドルです。

そして結果:

ID  TOTAL   AMOUNT  BAL    RUNTOTAL
1   1000    100     900    900
2   2000    200     1800   2700
3   3000    300     2700   5400
4   1200    500     700    6100
5   2000    600     1400   7500
6   1202    800     402    7902
7   220     50      170    8072
于 2013-02-17T17:58:22.090 に答える