mysql промежуточный итог как вид

Я по-прежнему SQL Server 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 ответ

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;

Обратите внимание, что это предполагает, что столбец "учетная запись / дата" является уникальным - повторные даты для учетной записи отсутствуют. В противном случае результаты не будут точно такими же.

Кроме того, кажется немного странным, что вы делаете промежуточную сумму по всем учетным записям и датам. Я мог бы ожидать промежуточного итога по счетам, но именно так вы сформулировали запрос в вопросе.

Другие вопросы по тегам