![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Просмотр результата SELECT по строкам в функции MySQL [D7, XP]
mefodiy © (2010-08-24 11:21:00)Уважаемые мастера, можно ли в хранимой процедуре или функции MySQL сделать выборку командой SELECT, а потом каким-то образом промотреть все строки (например, как в WHILE DO), по ходу анализируя и суммируя значения в переменные по определенным столбцам (просто командой SUM с условиями не получается).
mefodiy (2010-08-26 12:52:00) [1]Удалено модератором
Примечание: В форум по MySql
mefodiy (2010-08-25 14:56:00) [2]Цена каждый день продажине пересчитывается. Это нужно сделать в запросе. В том-то и сложность.
12 (2010-08-25 14:53:00) [3]че то неправильно
> для даты 30.07.2010 нужны результаты 1,32 и 1,42
каждый день пересчитывается цена, так что-ли?
а почему бы не хранить ее в таблице некой тогда, чтоб не пересчитывать?
а что будет, если в один из дней цена не пересчиталась? (не работали)
mefodiy (2010-08-25 14:33:00) [4]Так не получится, так как для каждой даты продажи (отпуска товара) нужны результаты предыдущих продаж.
Например для даты 30.07.2010 нужны результаты 1,32 и 1,42, которые уже должны быть рассчитаны.
12 (2010-08-25 13:39:00) [5]ну как-то так бы начал,
и надо потом подогнать под расчеты на бумаге
Unit_code CHAR(4) - cod
Out_date DATE - od
In_out CHAR(1) - io
Qty INT - qty
Amount DECIMAL(20,2) - a
select sum(aa) aa, sum(aa2) aa2, sum(aa)/sum(aa2) from
(
select
case
when t.io = 'I' then sum(A)
else -sum(A)
end aa,
case
when t.io = 'I' then sum(qty)
else -sum(qty)
end aa2
from Test t
where t.od < '14.07.2010'
group by t.io
)
mefodiy (2010-08-25 12:56:00) [6]Удалено модератором
mefodiy (2010-08-25 10:16:00) [7]Есть таблица MySQL с примерной (для упрощения) структурой
Unit_code CHAR(4)
Out_date DATE
In_out CHAR(1)
Qty INT
Amount DECIMAL(20,2)
Ниже приведен "кусок" этой таблицы для одного кода товара ("0001")
Unit_code Out_date In_out Qty Amount
0001 08.07.2010 I 48 57,60
0001 11.07.2010 I 32 48,00
0001 13.07.2010 I 25 32,50
0001 15.07.2010 O 53 95,40
0001 12.07.2010 I 24 43,20
0001 13.07.2010 I 35 45,50
0001 14.07.2010 O 48 91,20
0001 25.07.2010 I 15 16,50
0001 30.07.2010 O 63 100,80
Таблица отражает товародвижение на складе. В столбце "In_out" "I" - это поступление, "O" - отпуск товара со склада.
Qty - количество товара, Amount - стоимость поступившего или отпущенного количества товаров. Причем, если для поступивших товаров - это стоимость покупки (т.е. покупная цена помноженная на кол-во), то для отпущенных товаров - это сумма продажи (цена продажи помноженная на кол-во).
Целью запроса является получение отчета по продажам вида (цифры точные)
Код Дата Кол-во Цена Сумма Цена Сумма
покупки покупки продажи продажи
0001 15.07.2010 53 1,32 69,71 1,80 95,40
0001 14.07.2010 48 1,42 67,93 1,90 91,20
0001 30.07.2010 63 1,35 85,34 1,60 100,80
Сложность в подсчете цены покупки, которая должна быть средней ценой на момент продажи. Алгоритм расчета такой: нужно просуммировать на момент отпуска товара все значения "Amount" для In_out="I" вычесть отсюда сумму покупки (себестоимсоть) уже проданных к этой дате товаров (если таковые имеются) и поделить на остаток товара на дату продажи (в количественном выражении).
Поскольку понять "словесное объяснение", наверняка будет трудно, приведу расчеты цен покупки для трех приведенных выше дат продажи, исходя из исходной таблицы:
15.07.2010: (57,60+48,00+32,50)/(48+32+25)=1,32
14.07.2010: (57,60+48,00+32,50+43,20+45,50-1,32*53)/(48+32+25+24+35-53)=1,42
30.07.2010: (57,60+48,00+32,50+43,20+45,50+16,50-1,32*53-1,42*48)/(48+32+25+24+35-53-48)=1,35
Вот эту последнюю часть пришлось запихнуть в функцию с курсором. Может кто предложит вариант получения отчета одним запросом?
12 (2010-08-24 16:31:00) [8]
> mefodiy (24.08.10 16:05) [14]
Вы б привели таблицу и правило, по которому надо выбрать - может кто бы и запросом помог
Anatoly Podgoretsky (2010-08-24 16:08:00) [9]Ну так навигационные, а не реляционные методы.
mefodiy (2010-08-24 16:05:00) [10]Попробовал курсор. В принципе работает, но не так быстро как хотелось бы.
Ega23 (2010-08-24 15:26:00) [11]
> метод Селко можно заюзать для MS
Можно всё, можно и голову ногой почесать.
12 (2010-08-24 14:10:00) [12]метод Селко можно заюзать для MS
Ega23 (2010-08-24 13:37:00) [13]Тьфу, к листу.
Ega23 (2010-08-24 13:37:00) [14]
> Использование курсоров, как правило, признак неправильного
> дизайна.
Обход иерархической таблицы от корня к дереву.
Anatoly Podgoretsky (2010-08-24 12:22:00) [15]> mefodiy (24.08.2010 12:19:08) [8]
Использование курсоров, как правило, признак неправильного дизайна.
mefodiy (2010-08-24 12:19:00) [16]По описанию курсор - то, что надо. Буду пробовать. Спасибо
Anatoly Podgoretsky (2010-08-24 12:15:00) [17]
> mefodiy (24.08.10 11:21)
Если MySQL поддерживает курсоры, то это оно, если нет, то никак.
Игорь Шевченко (2010-08-24 11:59:00) [18]
> Все что переписывал без курсора, как бы сложно не было в
> запросе - работало быстрее.
руки
12 (2010-08-24 11:55:00) [19]
> Основание?
Книжку не помню, но из личного для MSSQL2000:
Все что переписывал без курсора, как бы сложно не было в запросе - работало быстрее.
Ega23 (2010-08-24 11:46:00) [20]
> Курсор не желателен
Основание?