mysql作为视图运行总计

时间:2014-12-28 16:41:57

标签: mysql view subquery running-total

我仍然是一个sql greenhorn并尝试转换此脚本,在mysql中构建一个运行总计作为视图:

DROP TABLE IF EXISTS `table_account`;

CREATE TABLE `table_account`    
 (
  id    int(11),
  account   int(11),
  bdate   DATE,
  amount  DECIMAL(10,2)
 );

ALTER TABLE `table_account` ADD PRIMARY KEY(id);

INSERT INTO `table_account` VALUES (1, 1, '2014-01-01', 1.0);
INSERT INTO `table_account` VALUES (2, 1, '2014-01-02', 2.1);
INSERT INTO `table_account` VALUES (4, 1, '2014-01-02', 2.2);
INSERT INTO `table_account` VALUES (5, 1, '2014-01-02', 2.3);
INSERT INTO `table_account` VALUES (3, 1, '2014-01-03', 3.0);
INSERT INTO `table_account` VALUES (7, 1, '2014-01-04', 4.0);
INSERT INTO `table_account` VALUES (6, 1, '2014-01-06', 5.0);
INSERT INTO `table_account` VALUES (8, 1, '2014-01-07', 6.0);

SET @iruntot:=0.00;

SELECT
    q1.account, 
    q1.bdate,
    q1.amount,
    (@iruntot := @iruntot + q1.amount) AS runningtotal
FROM
   (SELECT
        account AS account,   
        bdate AS bdate,
        amount AS amount
    FROM  `table_account`
ORDER  BY account ASC, bdate ASC) AS q1

这比在每一行上构建整个历史记录的总和要快得多。

我无法解决的问题是:

  • 在视图中设置
  • 视图中的子查询

我认为使用某种JOIN代替" SET @iruntot:= 0.00;"可能是不可能的。 并使用两个视图来防止需要子查询。 但我确实知道如何。

对于尝试任何提示都会感到高兴。 问候, 卫矛尺

1 个答案:

答案 0 :(得分:0)

MySQL不允许视图的from子句中的子查询。它也不允许变量。但是,您可以使用相关子查询执行此操作:

SELECT q.account, q.b_date, q.amount,
       (SELECT SUM(q2.amount)
        FROM myview1 q2
        WHERE q2.account < q.account OR
              q2.account = q.account and q2.date <= q.date
       ) as running total
FROM myview1 q;

请注意,这假设帐户/日期列是唯一的 - 帐户没有重复的日期。否则,结果将不完全相同。

此外,您在所有帐户和日期中执行总计运算似乎有点奇怪。我可能期望在帐户中运行总计,但这就是你在问题中制定查询的方式。