MySQL SUM()逐步收入列

时间:2012-03-04 15:14:42

标签: php mysql excel

数据库: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

3 个答案:

答案 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
}