Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.066 c
2-1144264669
skovorodka
2006-04-05 23:17
2006.04.23
Помогите, плиз, с запросом...


2-1144386983
Juice85
2006-04-07 09:16
2006.04.23
Delphi7+MySql


15-1143407363
SkyRanger
2006-03-27 01:09
2006.04.23
Математика для программиста


15-1144095238
systemis
2006-04-04 00:13
2006.04.23
Новейший Delphi проэкт


2-1144405937
Максим_86
2006-04-07 14:32
2006.04.23
Поместить иконку на панель задач