数据库:name_ allmoney
表名:MONEY
+-----+--------+------------+---------+---------+
| id | name | date | income | account |
+-----+--------+------------+---------+---------+
| 1 | Ann | 01.01.2012 | 100 | 100 |
| 2 | Matt | 02.01.2012 | 100 | 200 |
| 3 | Tom | 03.01.2012 | 100 | 300 |
| 4 | Peter | 04.01.2012 | 100 | 400 |
+-----+--------+------------+---------+---------+
Hello Stackoverflowers你好! ;)
我是MySQL的新手...上周我花了搜索解决上述情况。我正在尝试创建脚本求和收入列,但不仅显示列的总和,如
来自MONEY GROUP BY ID的SELECT *,SUM(kasa);
但是我必须添加名为account的新列,其中包含类似我的excel表格的选项:
accout1st row =income1+account1
accout2nd row =income2+account1
accout3rd row =income3+account2
accout4th row =income4+account3
是否有任何代码或可能在MySQL或PHP中创建帐户等列?
CREATE TABLE money (
id INT(11) NOT NULL AUTO_INCREMENT,
date DATE DEFAULT NULL,
income DECIMAL(11,4) DEFAULT NULL,
numer_kluczyka INT(11) DEFAULT NULL,
name CHAR(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
za_co CHAR(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
account INT(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
答案 0 :(得分:1)
如果我理解你的问题,你只需要存储到目前为止在php循环中计算的总和。
类似的东西:
$account = null;
while(($result = /* read mysql result */)) {
if (is_null($account)) { // Handle first row
$account = $result['income'];
}
// Show first columns
echo $result['id'], $result['income'], $account;
$account += $result['income'];
}
答案 1 :(得分:1)
您可以使用用户变量
来完成SELECT @m := 0;
SELECT
id,
name,
date,
income,
@m := @m + income AS balance
FROM money
ORDER BY date ASC, id ASC;
order by应该使用表的主键。
在PHP中拆分两个查询应解决问题 -
<?php
$connection = mysql_connect('host', 'user', 'pass') or die('failed to connect');
mysql_select_db("album", $connection) or die('failed to select db');
mysql_query("SELECT @m:=0;");
$result = mysql_query("SELECT id, imie_i_nazwisko, data_wplaty, kasa, @m := @m + income AS balance FROM money ORDER BY data_wplaty ASC , id ASC");
while($row = mysql_fetch_array($result)) {
echo $row['income'] . " " . $row['balance'];
echo "<br />";
}
答案 2 :(得分:0)
你的问题似乎有点不清楚,但是如果我猜对了你想要的东西,你可以用一个子选择来实现这一点,该选择将income
列与所有行相加到当前行:
SELECT id, name, date, income,
( SELECT SUM(income) FROM money AS b
WHERE b.id = a.id
AND b.date <= a.date
) AS balance
FROM money AS a
你也可以用连接做同样的事情:
SELECT a.id, a.name, a.date, a.income, SUM(b.income) AS balance
FROM money AS a
JOIN money AS b ON (b.id = a.id AND b.date <= a.date)
GROUP BY a.id, a.name, a.date, a.income
(GROUP BY
应该在money
表的主键上。从你的问题来看,主键应该是什么并不完全清楚,因为它似乎不是是id
。)
另请注意,这两个答案都假定date
列对于每个id
都是唯一的,并按时间按升序排序,以便条件b.date <= a.date
可以找到所有行包括当前行。如果不是这种情况,您应该修改表格,或者相应地调整查询。
修改:S0pra's PHP solution也可以。但是,在我阅读您的问题的方式中,您想要的是分别对每个id
的过去收入求和。如果是这样,您可以使用S0pra的代码进行一些修改:
$balance = array();
while ( $result = mysql_fetch_assoc( $res ) ) { // or equivalent
$id = $result['id'];
if ( array_key_exists( $id, $balance ) ) {
$balance[$id] += $result['income'];
} else {
$balance[$id] = $result['income']; // handle first row for this id
}
$result['balance'] = $balance[$id];
// do something with $result here
}