Оптимизировать запрос

2007-05-02 Пенетрантность Oleg Prosvetov
Респект, Усем!

Помогите пожалуйста написать запрос покороче, уж очень некрасиво получается:

select first 1
  (select count(c_price) from prices where c_price=1) c1,
  (select count(c_price) from prices where c_price=2) c2,
  (select count(c_price) from prices where c_price=3) c3
  from prices

С наилучшими пожеланиями, Oleg Prosvetov.

Re: Оптимизировать запрос

2007-05-02 Пенетрантность Andrei


select
  c_price, count(c_price)
from
  prices
where
  c_price in (1, 2, 3)
group by
  1


On May 2, 4:08 pm, Oleg Prosvetov [EMAIL PROTECTED] wrote:
 Респект, Усем!

 Помогите пожалуйста написать запрос покороче, уж очень некрасиво получается:

 select first 1
   (select count(c_price) from prices where c_price=1) c1,
   (select count(c_price) from prices where c_price=2) c2,
   (select count(c_price) from prices where c_price=3) c3
   from prices

 С наилучшими пожеланиями, Oleg Prosvetov.



Re: Оптимизировать запрос

2007-05-02 Пенетрантность Oleg Prosvetov
Привет, Andrei!

Это не совсем то что мне нужно :(

Должна получиться одна запись, где будут 3 поля с значениями

(ко-во записей где цена=1) | (ко-во записей где цена=2) | (ко-во записей где 
цена=3)


С наилучшими пожеланиями, Oleg Prosvetov.

Re: Оптимизировать запрос

2007-05-02 Пенетрантность Oleg LOA
Oleg Prosvetov [EMAIL PROTECTED] wrote in message news:[EMAIL PROTECTED]
 Привет, Andrei!
 
 Это не совсем то что мне нужно :(
 
 Должна получиться одна запись, где будут 3 поля с значениями
 
 (ко-во записей где цена=1) | (ко-во записей где цена=2) | (ко-во записей где 
 цена=3)
 

А самому подумать?

count(case when где цена=1 then 1 else null), count(case when где цена=2 then 1 
else null), count(case when где цена=3 then 1 else null)

Re: Оптимизировать запрос

2007-05-02 Пенетрантность WildSery

On Wed, 02 May 2007 18:20:54 +0400, Oleg LOA loa-JGs/[EMAIL PROTECTED] wrote:

 count(case when где цена=1 then 1 else null), count(case when где цена=2 then 
 1 else null), count(case when где цена=3 then 1 else null)

Не приходило в голову, что count и в case нулы игнорирует. Спасибо за пример.
Сам бы через сумму 1 и 0 делал.

-- 
Сергей Смирнов.



Re: помогите оптимизировать запрос

2006-06-08 Пенетрантность Andrei Yeryomin
Hello, Николай!
You wrote  on Wed, 07 Jun 2006 15:22:55 +0300:

 НВ сорри протупил - все там хорошо с левым джоином когда индексы не
 НВ подымаются для скидок
Вот так побеседуешь с хорошим человеком, и решение найдется, и довольным 
останешься.
;-)

--
With best regards,
  Andrei Yeryomin. 



--~--~-~--~~~---~--~~
-~--~~~~--~~--~--~---



помогите оптимизировать запрос

2006-06-06 Пенетрантность Николай Войнов
Здравствуйте, 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

-- 
С наилучшими пожеланиями,
Николай Войнов.


--~--~-~--~~~---~--~~
-~--~~~~--~~--~--~---