2014-12-28 3 views
0

Я еще SQL салага и попытаться преобразовать этот сценарий, построение нарастающим итогом в целях в MySQL: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 

Это гораздо быстрее, чем строить сумму за всю историю на каждой линии.

Проблемы, которые я не могу решить, являются:

  • Набор в виду
  • подзапросов в виду

Я думаю, что это может быть posssible использовать какой-то JOIN вместо «SET @iruntot : = 0,00;» и использовать два представления для предотвращения необходимости подзапроса. Но я знаю как.

Будем рады любым подсказкам. С уважением, Abraxas

+0

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли более легко реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+0

Привет, Strawberry, Я отредактировал мой вопрос, чтобы предоставить скрипт entre (проверен). Результат - это то, что мне нужно, но как представление не как запрос. – ABRAXAS

ответ

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; 

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

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

+0

Привет, Гордон, спасибо, но этот solutiion - это то место, откуда я пришел. Имея 10.000 строк, это очень медленно. Вот почему я попробовал это так. Я изменил свой questiion, добавил весь скрипт.sTrst – ABRAXAS

+0

извините ... нажал OK слишком рано Нужно 4 секунды для 10.000 записей против 1 минуты. Учетная запись будет выбрана через WHERE CLAUSE в запросе, считывающем нужный вид. Из-за интерфейса (OpenOffice) мне нужна вещь Wohle как представление, потому что OO не может фильтровать базы данных на собственные SQL-команды ... – ABRAXAS

Смежные вопросы