我仍然是一个sql新手,并尝试转换此脚本,在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;"可能是可能的;并使用两个视图来防止需要子查询。但我确实知道如何。
将很乐意尝试任何提示。问候阿布拉克萨斯
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;
请注意,这假定帐户/日期列是唯一的 - 帐户没有重复的日期。 否则,结果将不完全相同。
此外,您对所有帐户和日期进行汇总似乎有点奇怪。 我可能期望帐户内有一个运行总计,但这就是您在问题中制定查询的方式。