Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Как написать запрос в 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 — не 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;
Неактивен
Решение:
select A, B, C, @d := greatest(@d + B - C, 0) D
from tab1, (select @d := 0) t
order by A
Неактивен
Чего только не придумают люди, чтобы усложнить себе жизнь
Неактивен
Это жизнь усложняется, а мы пытаемся упростить ее.
Указанное выше решение работает только для одного товара. Если товаров много, то нужно считать по-другому. Поэтому тема всё еще открыта.
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)
Неактивен
А вот и решение:
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)
Неактивен
Страниц: 1