• Ласкаво просимо на Спільнота для обміну досвідом між користувачами програм УкрБланк, УкрСклад, УкрЗарплата.
 

Выборка товаров SQL запросом с сортировкой по цене

Автор maxmokry, Березень 20, 2015, 14:52:11

Попередня тема - Наступна тема

0 Користувачі і 3 Гостей дивляться цю тему.

maxmokry

Добрый день.

Есть задача SQL запросом выбрать товары определенной категории с сортировкой по цене.
казалось бы что то типа

select * from TOVAR_NAME order by CERA_R DESC - но это работает неправильно, так как товары в таблице могут быть в разных валютах.
Есть ли какое-то тривиальное решение этого вопроса?

типа select * from TOVAR_NAME order by (CERA_R * КУРС(CENA_OUT_CURR_ID)) DESC
[url="http://goo.gl/ciUwjI"]http://goo.gl/ciUwjI[/url] - Синхронизация УС с VirtueMart, [url="http://goo.gl/Uh3GBC"]http://goo.gl/Uh3GBC[/url] - Интернет-магазин на базе укрсклада без импорта/экспорта

admin

В чем именно проблема в сортировке по expression, а не по полю? В Firebird это работает без проблем:
SELECT
  tn.*
FROM
  tovar_name tn
ORDER BY
  (tn.cena_r * 25.2) DESC


Или отображением поля в нац валюте? Вот пример:
SELECT
  t.*,
  CASE
    WHEN (t.cena_out_curr_id = :nac_val_id) THEN t.cena_r
    WHEN (c.how_to_calc = 0 AND c_out.how_to_calc = 1) THEN t.cena_r/c.kurs/c_out.kurs
    WHEN (c.how_to_calc = 1 AND c_out.how_to_calc = 1) THEN t.cena_r*c.kurs/c_out.kurs
    WHEN (c.how_to_calc = 0 AND c_out.how_to_calc = 0) THEN t.cena_r/c.kurs*c_out.kurs
    WHEN (c.how_to_calc = 1 AND c_out.how_to_calc = 0) THEN t.cena_r*c.kurs*c_out.kurs
  END AS nac_cena_r
FROM
  tovar_name t
    JOIN currency c ON c.num = :nac_val_id
    JOIN currency c_out ON c_out.num = t.cena_out_curr_id
ORDER BY
  nac_cena_r

Вроде так :) В 2.5 можно и alias указывать в сортировке, как в примере выше. :nac_val_id - это ID нац валюты. Пример для розничной расходной цены, для приходной вместо cena_out_curr_id используется cena_curr_id. Подобный расчет можно посмотреть в SQL скрипте отчета "Прайс-лист".

Вот хороший мануал по Firebird 2.5 на русском:
http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird-Language-Reference-Russian.pdf

maxmokry

О ДА!
Очень интересная конструкция :)
Как то в других БД я не натыкался на условия подстановки полей в зависимости от значения других полей :)
Спасибо. Вроде работает. Осталось только еще внести туда понятия скидок :)
[url="http://goo.gl/ciUwjI"]http://goo.gl/ciUwjI[/url] - Синхронизация УС с VirtueMart, [url="http://goo.gl/Uh3GBC"]http://goo.gl/Uh3GBC[/url] - Интернет-магазин на базе укрсклада без импорта/экспорта