Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка значения без присоединения копии таблицы  [new]
DeViLsssss
Member

Откуда:
Сообщений: 60
Здравствуйте!
Предположим есть таблица (prices) из 2 полей: name, price_param, price.
Необходимо для name в зависимости от значения price_param выводить значения price,
т.е. сделать такую таблицу : name, price1, price2, price3
Мой запрос на данный момент такой и он работает, но долго:
select pr.name,
         pr1.price1,
         pr2.price2,
         pr3.price3
from prices as pr
left join (select name, prices from prices where price_param='Условие 1') as pr1 on (pr.name=pr1.name)
left join (select name, prices from prices where price_param='Условие 2') as pr2 on (pr.name=pr2.name)
left join (select name, prices from prices where price_param='Условие 3') as pr3 on (pr.name=pr3.name)

Пробовал сделать так:
select name,
         case
         when price_param='Условие 1' then         
         price
         end as price1,         
         case
         when price_param='Условие 2' then         
         price
         end as price2,         
         case
         when price_param='Условие 3' then         
         price
         end as price3,         
from prices

, но появляются пустые строки, от которых нужно избавляться.
Вопрос такой: Если какой-нибудь способ выбрать данные в одну строку не присоединяя копию таблицы 3 раза (запрос приведен для примера, чтобы логику понять. Реальные таблицы очень большие, и выборка идет очень долго, даже при индексировании, причем данная выборка сама используется в качестве подзапроса для joinа)
2 авг 12, 06:31    [12949951]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 649
select name,
         MAX(case
         when price_param='Условие 1' then         
         price
         end) as price1,         
         MAX(case
         when price_param='Условие 2' then         
         price
         end) as price2,         
         MAX(case
         when price_param='Условие 3' then         
         price
         end) as price3,         
from prices
GROUP BY pr.name
2 авг 12, 06:49    [12949959]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
DeViLsssss
Member

Откуда:
Сообщений: 60
Guf,
к сожалению не катит.
Пробовал аналогичную с SUM и AVG - выдает ошибку что невозможно применить функцию к выражению. (С MAXом тоже попробовал, та же история)
2 авг 12, 07:29    [12949989]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1358
Почитайте про использоавание операторов PIVOT/UNPIVOT. Если згачения числовые, а цена это число - то как раз то что нужно. Пример пока не дам, пишу с телефона
2 авг 12, 07:32    [12949994]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
DeViLsssss
Member

Откуда:
Сообщений: 60
VSVLAD,
Благодарю! Почитаю!
П.С. не торопитесь с примером, попробую разобраться сам))
2 авг 12, 07:38    [12949998]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
мимо
Guest
как-то так?
2 авг 12, 08:32    [12950063]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значения без присоединения копии таблицы  [new]
BarlogOfMorgat
Guest
автор
Пробовал сделать так:

select name,
case
when price_param='Условие 1' then
price
end as price1,
case
when price_param='Условие 2' then
price
end as price2,
case
when price_param='Условие 3' then
price
end as price3,
from prices

, но появляются пустые строки, от которых нужно избавляться.


от пустых строчек обычно избавляются условием where
примерно так
where price_param='Условие 1' or price_param='Условие 2' or price_param='Условие 3'
2 авг 12, 11:54    [12951201]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить