SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.09.2010 08:32:59

aliputin
Завсегдатай
Зарегистрирован: 08.03.2010
Сообщений: 36

SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

Как написать запрос в MySQL, делающий вычисления как в Excel'е? [РЕШЕНО]

Вот, что я делаю в Excel'е. Есть таблица с колонками:
код товара (колонка E),
день (колонка A),
приход (колонка B),
расход (колонка C),
остаток (колонка D).
Ячейки в колонке D (остаток) содержат формулу для вычисления остатка: остаток предыдущего дня + сегодняшний приход - сегодняшний заказ.
Например, для строки 25 (это день 25): = b25+d24-c25.
При этом надо иметь в виду, что остаток не может быть отрицательным. Если расхода больше, чем есть в наличие, тогда остаток обнуляется. Разумеется, остатки должны считаться по-товарно, а не всё вместе.
Например,
день 24, приход 500, расход 700, остаток 0;
день 25, приход 600, расход 500, остаток 100;
день 26, приход 700, расход 500, остаток 300 (потому что 200 сегодня + 100 вчера).

Как это сделать в MySQL?

Отредактированно aliputin (23.11.2011 15:44:52)


MySQL 5.5.27
MariaDB 5.5.27

Неактивен

 

#2 01.09.2010 11:12:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

MySQL — не Excel. У них разные предназначения.

Для решения Вашей задачки могу предложить два способа:
1. Экспортировать данные в Excel и работать старым способом.
2.
SELECT @b := income FROM tablename WHERE id = 25;
SELECT @c := expenditure FROM tablename WHERE id = 25;
SELECT @d := balance FROM tablename WHERE id = 24;
SELECT @b + @d - @c;

Неактивен

 

#3 01.09.2010 15:55:38

aliputin
Завсегдатай
Зарегистрирован: 08.03.2010
Сообщений: 36

Re: SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

Решение:

select A, B, C, @d := greatest(@d + B - C, 0) D
from tab1, (select @d := 0) t
order by A


MySQL 5.5.27
MariaDB 5.5.27

Неактивен

 

#4 01.09.2010 17:01:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

Чего только не придумают люди, чтобы усложнить себе жизнь smile

Неактивен

 

#5 02.09.2010 14:46:06

aliputin
Завсегдатай
Зарегистрирован: 08.03.2010
Сообщений: 36

Re: SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

Это жизнь усложняется, а мы пытаемся упростить ее.

Указанное выше решение работает только для одного товара. Если товаров много, то нужно считать по-другому. Поэтому тема всё еще открыта.

CREATE TABLE `tbl` (
`e` bigint( 20 ) unsigned NOT NULL AUTO_INCREMENT COMMENT 'код товара',
`a` int(10) NOT NULL COMMENT 'дата',
`b` bigint( 20 ) NOT NULL COMMENT 'приход',
`c` bigint( 20 ) NOT NULL COMMENT 'расход',
UNIQUE KEY `e` ( `e`,`a` ) ,
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci COMMENT = 'остатки';

#это код хранимой процедуры:
begin

select
e,
a,
b,
c,
@d:=greatest(@d+b-c,0) d
from tbl,
(select @d:=0) t
order by e,a;

end

Отредактированно aliputin (23.11.2011 15:45:58)


MySQL 5.5.27
MariaDB 5.5.27

Неактивен

 

#6 02.09.2010 14:58:04

aliputin
Завсегдатай
Зарегистрирован: 08.03.2010
Сообщений: 36

Re: SQL-запрос, делающий вычисления как в Excel'е, ссылка на ячейку предыдущей строки

А вот и решение:

select
a,
b,
c,
@d := greatest(if(@olde = e, @d, 0) + b - c, 0) d,
@olde := e e
from tbl,
(select @d:=0, @olde := null) t
order by e,a;

Отредактированно aliputin (25.03.2011 14:13:48)


MySQL 5.5.27
MariaDB 5.5.27

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson