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

Откуда:
Сообщений: 517
День добрый!
Есть относительно большие таблицы, с миллионами строк, нужно написать как можно быстрый селект, чтоб в итоге получить такой вот результат.
Грубо говоря, для примера, есть таблица со всеми продажами, известно, что продают только помидоры или огурцы и каждый покупатель может находиться в таблице максимум два раза, один с помидорами и один с огурцами, не нужно суммировать:
create table #tbl (Клиент int, Товар nvarchar(50),Кг int)

insert into #tbl
select 1,N'Помидоры',10 union
select 2,N'Помидоры',20 union
select 1,N'Огурцы',100 union
select 3,N'Помидоры',30 union
select 4,N'Огурцы',400 union
select 3,N'Огурцы',300 union
select 2,N'Огурцы',200 


Нужно получить список клиентов с покупками, типа того:
Клиент Помидоры_Кг Огурцы_Кг
110100
220200
330300
4NULL400


Самый простой способ- это такой:
select t.Клиент,t1.Кг as Помидоры_Кг, t2.Кг as Огурцы_Кг
from 
(select distinct Клиент from #tbl) t
left join #tbl t1 on t.Клиент=t1.Клиент and t1.Товар=N'Помидоры'
left join #tbl t2 on t.Клиент=t2.Клиент and t2.Товар=N'Огурцы' 


Но хотелось бы знать или можно написать более продуктивный код, чтоб не "проходить" по всей таблице 3 раза?
В оригинале не таблица, а данные из нескольких относительно больших таблиц.
15 дек 15, 15:46    [18563468]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз написать скрипт, пивот?  [new]
Glory
Member

Откуда:
Сообщений: 104760
abrashka
Самый простой способ- это такой:
select t.Клиент,t1.Кг as Помидоры_Кг, t2.Кг as Огурцы_Кг
from 
(select distinct Клиент from #tbl) t
left join #tbl t1 on t.Клиент=t1.Клиент and t1.Товар=N'Помидоры'
left join #tbl t2 on t.Клиент=t2.Клиент and t2.Товар=N'Огурцы' 


select t.Клиент,case when t.Товар=N'Помидоры' then t.Кг end as Помидоры_Кг, case when t.Товар=N'Огурцы'  then t.Кг end  as Огурцы_Кг
from #tbl t
15 дек 15, 15:50    [18563501]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз написать скрипт, пивот?  [new]
tt1
Guest
select t.Клиент
,sum(case when t.Товар=N'Помидоры' then t.Кг end) as Помидоры_Кг
,sum(case when t.Товар=N'Огурцы' then t.Кг end) as Огурцы_Кг
from #tbl t
group by t.Клиент
15 дек 15, 15:52    [18563505]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз написать скрипт, пивот?  [new]
MKDT
Guest
SELECT Клиент,[Помидоры],[Огурцы] FROM #tbl
PIVOT(SUM(Кг) FOR Товар in ([Помидоры],[Огурцы])) pvt
15 дек 15, 15:52    [18563511]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз написать скрипт, пивот?  [new]
abrashka
Member

Откуда:
Сообщений: 517
Glory,
Спасибо, но в Ваш код вернет каждого клиента несколько раз, а нужно только один, т.е нужно сгруппировать, как сделал tt1.

tt1,MKDT
Спасибо, проверю на настоящей базе какой способ более эффективный.
15 дек 15, 15:59    [18563559]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить