![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AVG,передача данных из 1 таблицы в другую,соблюдая группировку [D7, MS Access]
John_Doe © (2006-02-24 13:49:00)Такая задача.
Есть таблица 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
Выдает одно и тоже значение для всех записей.
sniknik (2006-02-25 15:20:00) [1]> Как бы вы поступили в случае такого задания?
сделал бы "вьюшку"(view), в которой обьеденение двух таблиц с расчетом этой самой "средневзвешенной" цены.
(ну тут она не совсем средневзвешенная, судя по всему)
John_Doe (2006-02-25 14:52:00) [2]
> Грамотный подход заключается не в "средней", а в "средневзвешенной"
> цене (т.е.сумма остатка / кол-во остатка).
Могли по подробнее?
> Которая, собственно, и нафиг в базе не нужна, а нужна лишь
> для "глаз клиента", след-но, надо ее считать по мере надобности
> чисто "для клиента" запросом.
Хмм..
Согласен...
Я так и сделаю.
> хм... ну если отбросить, то что это нафиг не нужно, и логика
> запроса "хромает",
Все дело в том,что в любом случае,цены конкретного товара,находятся в другой таблице.
И в любом случае надо вычислить их "средневзвешенную" цену,после чего ввести это значение в поле(будь то физически расположенное,или виртуальное) уже другой таблицы содержащей информацию о зарегестрированном товаре.
Как бы вы поступили в случае такого задания?
> 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 14:02:00) [3]> Структуризированный язык запросов (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 09:19:00) [4]
> в "мурзилке" искал?
"Структуризированный язык запросов (SQL)
Учебное пособие
Санкт-Петербургский Государственный институт
точной механики и оптики (технический университет)
Кафедра вычислительной техники
В.В.Кириллов, Г.Ю.Громов"
-На мурзилку не особо похоже.И на плейбой тоже.
У меня еще один вопрос появился...
UPDATE WareInfo
SET Apx_AZM_Sell =
( SELECT AVG(Price_AZM_Sell)
FROM WareList
WHERE Id=39 );
Он выдает ошибку:
--------------------------------------------------------
В операции должен использоваться обновляемый запрос.
---------------------------
ОК
---------------------------
Как это реализовать?
Как сделать так,чтоб Apx_AZM_Sell присваивалось среднее арифметическое столбца из другой таблицы?
sniknik (2006-02-24 22:55:00) [5]> В книжке не нашел. :(
в "мурзилке" искал? попробуй в той где на обложке присутствует слово "SQL". больше вероятность нахождения...
Desdechado (2006-02-24 22:54:00) [6]> В книжке не нашел
Наверно, не в той книжке искал. Почитай книжку по SQL.
John_Doe (2006-02-24 22:34:00) [7]JOIN...
Это что-за оператор?
В книжке не нашел. :(
Desdechado (2006-02-24 15:32:00) [8]> FROM WareList,WareInfo
from из нескольких таблиц без указания способа их соединения (WHERE или JOIN) дает декартово произведение
msguns (2006-02-24 14:05:00) [9]Не понял зачем держать в таблице явно вычисляемое, пусть и "вертикально", поле (т.н. "Средняя цена"), ведь при любом движении этой позиции эту самую среднюю цену надо править.
А если, к примеру, удаляется (откатывается) целый документ, то пересчитывать и править надо все позиции, перечисленные в документе.
Вообще со "средней" ценой надо очень осторожно работать дабы не начудить. Грамотный подход заключается не в "средней", а в "средневзвешенной" цене (т.е.сумма остатка / кол-во остатка). Которая, собственно, и нафиг в базе не нужна, а нужна лишь для "глаз клиента", след-но, надо ее считать по мере надобности чисто "для клиента" запросом.