powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ORDER BY PRICE
14 сообщений из 14, страница 1 из 1
ORDER BY PRICE
    #32238536
Фотография Groove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, подскажите как отсортировать запрос по ценам если они указаны в разных единицах
например таблица SALES
goods price money

Товар1 100 USD
Товар2 200 USD
Товар3 100 EUR
Товар4 10000 РУБ

что то типа того

Код: plaintext
1.
2.
3.
4.
SELECT goods, 
(if MONEY='USD' THEN PRICE* 30 ,
if MONEY='EUR' THEN PRICE* 32 ,
if MONEY='РУБ' THEN PRICE) as exprice FROM SALES 
ORDER BY exprice


желательно на чистом SQL (не PL/SQL или TSQL)

Заранее благодарен!!!
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238692
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно перевести в одну систему. В доллары, евро или рубли. Иначе никакой сортировки не получится. Компьютеру всё равно как мы цену измеряем. Он биты в байтах считает. :)

В общем, нужно ещё одно поле завести, которое будет указывать вид валюты. Можно. конечно. и так, как у вас через поле price, но я обычно завожу целочисленный идентификатор для связи. Плюс таблицу - справочник валют. Только сразу поределитесь с тем, какая валюта будет базовой. Для неё курс равен 1, а для остальных нужно будет посчитать и внести в таблицу.

Например:

TableGoods (ID_Goods,NameGoods,price,ID_Money)
TableMoney (ID_Money,NameMoney,CursMoney)

тогда запрос будет выглядеть примерно так:

select ID_Goods,NameGoods,Price,NameMoney,(Price*CursMoney) as RealPrice
from TableGoods,TableMoney
where TableGoods.ID_Money=TableMoney.ID_Money
order by RealPrice,NameGoods

В этом случае вам не придётся переписывать запрос при изменении курса валют.

Кстати, по собтвенному опыту знаю, что в справочнике товаров лучше иметь ссылку на таблицу валют с курсами, а вот в счетах и прочих документах, которые выписываются на конкретную дату, желательно курс и вид валюты сохранять в каждой записи. Иначе при изменении курса в базовой таблице у вас поплывут все суммы в ранее оформленных и внесённых в базу документах. Если нужно будет для счёта поменять курс, то просто деламем хранимую процедуру и меняем соответствующее поле во всех необходимых записях.

Удачи!
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238725
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мыльников> нужно перевести в одну систему. В доллары, евро или рубли. Иначе никакой сортировки не получится. Компьютеру всё равно как мы цену измеряем. Он биты в байтах считает. :)

>В общем, нужно ещё одно поле завести, которое будет указывать вид валюты.

В принципе это же можно сделать и "на лету" используя

select t.*, ... from (select ... as x, ...) as t, ... order by x;

внутренний селект переведет все в одну систему, положит в поле x, а внешний отсортирует и получится чистый SQL. Производительность не обсуждается.
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238738
Фотография Groove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Большое спасибо!
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238744
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с127
сработает не везде
Oracle примет, а вот IB нет
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238775
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во второй версии ФБ обещают сделать. в рассылке уже идет обсуждение.
(мечтательно вздыхая) а может в 1.6 сделают :-)
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32238897
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше иметь следующую структуру:

Table Sales
Goods
Money_ID
Price

Здесь хранятся собственно цены на товары (услуги).

Table Money
Money_ID
Money_Name

Здесь хранится список валют.

Table Money_Course
Money_ID
Course_Date
Course

Здесь хранятся курсы валют на определенную дату. Желателен уникальный ключ по идентификатору+дата, или контроль в хранимой процедуре.

Тогда легко получим цены на любой период одним простым селектом

select Goods, S.Price*C.Course as RUB, M.Money_Name, C.Price
from Sales S, Money M, Money_Course C
where S.Money_ID=M.Money_ID and S.Money_ID=C.Money_ID and
C.Course_Date=(select max(CS.Course_Date)
from Money_Course CS where CS.Date<=:Def_Date CS.Money_ID=M.Money_ID)


Переменная :Def_Date задается при необходимости вычислить цену в предыдущем периоде.
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32239072
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мыльников,
"Только сразу поределитесь с тем, какая валюта будет базовой"
А как быть, если базовая валюта постоянно меняется?
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32239109
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это она для пользователя меняется, а в базе будет одна. просто у каждой валюты есть коэффициент пересчета. у базовой он равен еденице. меняется базовая, пересчитываются коэффициенты таким образом, чтобы базовый коэффициент стал еденицей. а остальные меняются пропорционально.
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32239112
Фотография Groove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да наверное и менять ничего не надо ...
Пропорции то остаются...
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32239150
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если структура такова, что все расчеты крутятся вокруг одной, "базовой" валюты, а потом она вдруг меняется, наступает ж
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32239657
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 StarWind
>с127
> сработает не везде
> Oracle примет, а вот IB нет

Все правильно, я не претендую на лучшее решение.

В крайнем случае можно внутренний селект вынести во view, они по-видимому даже в FB есть. На всякий случай: в аксессе аналогом вью являются query. Шутка.

Кстати при внезапной замене базовой валюты мой вариант может и не сломается.
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32240092
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "базовая валюта меняется и наступет ж..."?! :)

Базовая валюта это как 0 в системе координат. Его можно переместить, но совсем убрать невозможно. Допустим Вы удалили строчку с базовой валютой из таблицы. Ну и что? По сути это ведь не параметр базы данных, а некое условное понятие. У оставшихся валют коэффициенты остались на месте, так что программа будет продолжать работать как и раньше. В принципе можно вообще использовать систему измерения напрмиер в попугаях. Только при этом нужно чётко поределиться с коэффициентами пересчёта всех используемых валют в попугаи. :)

На самом деле базовая валюта это понятие в сознании оператора. И нужно это понятие для того, чтобы оператор знал какие коэффициенты в базу вводить. Естественно, что если Вы или Ваше Начальство решило сменить базовую валюту, то придётся заново расчитать и ввести коэффициенты (курсы) для всех валют. А как по другому-то? Если у Вас есть решение, то поделитесь, буду очень благодарен.
...
Рейтинг: 0 / 0
ORDER BY PRICE
    #32240232
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мыльников

Что значит "базовая валюта меняется и наступет ж..."?! :)

Базовая валюта это как 0 в системе координат

Верно мыслим :) Курс ВСЕГДА привязан к некоторой базовой валюте, следовательно если до часа "Ч" у нас была валюта "тугрик", то и курс валют мы указывали в тугриках, а вот после часа "Ч" (после смены базовой валюты на "попугаи") курс должен быть указан в попугаях. Соответственно так же будут указаны и цены на товар, в данном конкретном случае.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ORDER BY PRICE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]