Форум: "Базы";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизAVG,передача данных из 1 таблицы в другую,соблюдая группировку Найти похожие ветки
← →
John_Doe (2006-02-24 13:49) [0]Такая задача.
Есть таблица WareInfo
Поля ID,Name,ApxPrice.(др. поля в данном вопросе не актуальны)
Это таблица с названиями товаров,и их средней ценой.
Есть также таблица WareList.
Поля ID,Date,Price.
Вначале делается регистрация товара,данные вводятся в таблицу WareInfo.
Затем конкретно выбрав зарегестрированный ранее товар,можно сделать импорт.
Данные об импортированном товаре вводятся в таблицу WareList - дата импорта,цена за которую товар импортировали,а также
автоматически вписывается(использовал Lookup) значение ID,которое соответствует ID из WareInfo.
У меня не получается сделать следующее:
Сгруппировать данные из WareList по полю ID,вычислив AVG столбца Price,и чтоб полученные для группы значения AVG,вписывались
в ApxPrice таблицы WareInfo.
Как это реализовать?
Ведь если пишу:
SELECT WareInfo.ID,AVG(WareList.Price_AZM_Sell) AS ApxPrice
FROM WareList,WareInfo
GROUP BY WareInfo.ID
Выдает одно и тоже значение для всех записей.
← →
msguns © (2006-02-24 14:05) [1]Не понял зачем держать в таблице явно вычисляемое, пусть и "вертикально", поле (т.н. "Средняя цена"), ведь при любом движении этой позиции эту самую среднюю цену надо править.
А если, к примеру, удаляется (откатывается) целый документ, то пересчитывать и править надо все позиции, перечисленные в документе.
Вообще со "средней" ценой надо очень осторожно работать дабы не начудить. Грамотный подход заключается не в "средней", а в "средневзвешенной" цене (т.е.сумма остатка / кол-во остатка). Которая, собственно, и нафиг в базе не нужна, а нужна лишь для "глаз клиента", след-но, надо ее считать по мере надобности чисто "для клиента" запросом.
← →
Desdechado © (2006-02-24 15:32) [2]> FROM WareList,WareInfo
from из нескольких таблиц без указания способа их соединения (WHERE или JOIN) дает декартово произведение
← →
John_Doe (2006-02-24 22:34) [3]JOIN...
Это что-за оператор?
В книжке не нашел. :(
← →
Desdechado © (2006-02-24 22:54) [4]> В книжке не нашел
Наверно, не в той книжке искал. Почитай книжку по SQL.
← →
sniknik © (2006-02-24 22:55) [5]> В книжке не нашел. :(
в "мурзилке" искал? попробуй в той где на обложке присутствует слово "SQL". больше вероятность нахождения...
← →
John_Doe (2006-02-25 09:19) [6]
> в "мурзилке" искал?
"Структуризированный язык запросов (SQL)
Учебное пособие
Санкт-Петербургский Государственный институт
точной механики и оптики (технический университет)
Кафедра вычислительной техники
В.В.Кириллов, Г.Ю.Громов"
-На мурзилку не особо похоже.И на плейбой тоже.
У меня еще один вопрос появился...
UPDATE WareInfo
SET Apx_AZM_Sell =
( SELECT AVG(Price_AZM_Sell)
FROM WareList
WHERE Id=39 );
Он выдает ошибку:
--------------------------------------------------------
В операции должен использоваться обновляемый запрос.
---------------------------
ОК
---------------------------
Как это реализовать?
Как сделать так,чтоб Apx_AZM_Sell присваивалось среднее арифметическое столбца из другой таблицы?
← →
sniknik © (2006-02-25 14:02) [7]> Структуризированный язык запросов (SQL)
если в книге по языку не написано об основных конструкциях этого языка... -> литература не лучше "мурзилки".
"в печку ее!" © п. Преображенский.
> Как это реализовать?
> Как сделать так,чтоб Apx_AZM_Sell присваивалось среднее арифметическое столбца из другой таблицы?
хм... ну если отбросить, то что это нафиг не нужно, и логика запроса "хромает", а просто реализовать этот (ошибочный имхо) алгоритм данного запроса... то ничего лучше временной таблици в голову не приходит... (идея фикс - все запросами, хотя, т.к. аксесс делает по команде зараз, то проще было бы вернуть результат в одном и присвоить результат в другом, раз уж все одно 2(/3 + 1 на удаление) запроса делать, другое дело если бы все значения (от сгруппированной например таблици) передавались а не одно на всех, то другое дело)
SELECT -1 AS ID, AVG(Price_AZM_Sell) AS AvgPrice
INTO Tmp
FROM WareList
WHERE Id=39
UPDATE WareInfo w INNER JOIN Tmp t On w.ID <> t.ID
SET w.Apx_AZM_Sell = t.AvgPrice
ну и
DROP TABLE Tmp
← →
John_Doe (2006-02-25 14:52) [8]
> Грамотный подход заключается не в "средней", а в "средневзвешенной"
> цене (т.е.сумма остатка / кол-во остатка).
Могли по подробнее?
> Которая, собственно, и нафиг в базе не нужна, а нужна лишь
> для "глаз клиента", след-но, надо ее считать по мере надобности
> чисто "для клиента" запросом.
Хмм..
Согласен...
Я так и сделаю.
> хм... ну если отбросить, то что это нафиг не нужно, и логика
> запроса "хромает",
Все дело в том,что в любом случае,цены конкретного товара,находятся в другой таблице.
И в любом случае надо вычислить их "средневзвешенную" цену,после чего ввести это значение в поле(будь то физически расположенное,или виртуальное) уже другой таблицы содержащей информацию о зарегестрированном товаре.
Как бы вы поступили в случае такого задания?
> SELECT -1 AS ID, AVG(Price_AZM_Sell) AS AvgPrice
> INTO Tmp
> FROM WareList
> WHERE Id=39
>
> UPDATE WareInfo w INNER JOIN Tmp t On w.ID <> t.ID
> SET w.Apx_AZM_Sell = t.AvgPrice
>
> ну и
> DROP TABLE Tmp
За код спасибо.
← →
sniknik © (2006-02-25 15:20) [9]> Как бы вы поступили в случае такого задания?
сделал бы "вьюшку"(view), в которой обьеденение двух таблиц с расчетом этой самой "средневзвешенной" цены.
(ну тут она не совсем средневзвешенная, судя по всему)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c