Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.019 c
15-1143631131
Ketmar
2006-03-29 15:18
2006.04.23
очень глупый баг %-)


15-1143871258
boriskb
2006-04-01 10:00
2006.04.23
Кто то еще помнит.


2-1144267669
Std
2006-04-06 00:07
2006.04.23
определение недели по дате


2-1144333249
seleman
2006-04-06 18:20
2006.04.23
Кнопки


3-1140954126
g.town
2006-02-26 14:42
2006.04.23
CDX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский