Здравствуйте, gmane.comp.db.firebird.Russian!
Eсть приблизительно такая схемка - производители, товары, продавцы,
прайс-листы (несколько колонок цен). Есть три вида скидок (1) продавца
на конкретную единицу товара, (2) скидки продавца на товары
определенного производителя и просто фиксированные скидки поставщика.
producer(id, name)
product(id, producer_id, name)
seller (id, name, price_category, discount_1, discount_2);
x_discounts (seller_id, product_id, discount_1, discount_2);
y_discounts (seller_id, producer_id, discount_1, discount_2);
proposals (id, product_id, seller_id, price_1, price_2)
для получения прайс-листа с учетом скидок использую примерно такой
страшный сиквел
select
p1.name,
coalesce(
price_1 * (select d1.discount_1 from x_discounts d1 where
d1.seller_id = p1.seller_id and d1.product_id = p1.id),
price_1 * (select d2.discount_1 from y_discounts d2 where
d2.seller_id = p1.seller_id and d2.producer_id = p1.producer_id),
price_1 * s1.discount_1
price_1) price_disc_1,
coalesce(
price_2 * (select d1.discount_2 from x_discounts d1 where
d1.seller_id = p1.seller_id and d1.product_id = p1.id),
price_2 * (select d2.discount_2 from y_discounts d2 where
d2.seller_id = p1.seller_id and d2.producer_id = p1.producer_id),
price_1) price_disc_2,
from
product p1
join proposals p2 on p1.id = p2.product_id
join sellers s1 on p2.seller_id = s1.id
Можно ли такое сделать как-нибудь такую выборку пооптимальнее?
Еще аналогичным образом ищется предложение с минимальной ценой на
определенный товар с учетом того, что с каждым из поставщиков мы можем
работать по разной категории цен. Может тут тоже можно что-то придумать?
select
first 1 p2.id,
p2.seller_id,
p2.price_category,
case p2.price_category
when 1 then coalsce(
price_1 * (select d1.discount_1 from x_discounts d1 where
d1.seller_id = p1.seller_id and d1.product_id = p1.id),
price_1 * (select d2.discount_1 from y_discounts d2 where
d2.seller_id = p1.seller_id and d2.producer_id = p1.producer_id),
price_1 * s1.discount_1
price_1)
when 2 then coalsce(
price_2 * (select d1.discount_2 from x_discounts d1 where
d1.seller_id = p1.seller_id and d1.product_id = p1.id),
price_2 * (select d2.discount_2 from y_discounts d2 where
d2.seller_id = p1.seller_id and d2.producer_id = p1.producer_id),
price_1)
end price,
case p2.price_category
end discount
form
product p1
join proposals p2 on p1.id = p2.product_id
join sellers s1 on p2.seller_id = s1.id
where
p1.id = :product_id
order by
4
--
С наилучшими пожеланиями,
Николай Войнов.
--~--~-~--~~~---~--~~
-~--~~~~--~~--~--~---