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

Откуда:
Сообщений: 67
Есть таблица вида

 id_product   qty   type
----------- ----- ----
1 5 1
1 12 2
1 3 3

Надо получить новую в таком вот формате

 id_product      qty_type1      qty_type2    qty_type3
------------ --------- ------------ -----------
1 5 12 3
никак не соображу как трансформировать в такой вид. заранее благодарю.
20 июн 14, 18:41    [16197290]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Durex_
Есть таблица вида

 id_product   qty   type
----------- ----- ----
1 5 1
1 12 2
1 3 3

Надо получить новую в таком вот формате

 id_product      qty_type1      qty_type2    qty_type3
------------ --------- ------------ -----------
1 5 12 3
никак не соображу как трансформировать в такой вид. заранее благодарю.


PIVOT вам поможет http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
20 июн 14, 18:43    [16197298]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
a_voronin
Durex_
Есть таблица вида

 id_product   qty   type
----------- ----- ----
1 5 1
1 12 2
1 3 3

Надо получить новую в таком вот формате

 id_product      qty_type1      qty_type2    qty_type3
------------ --------- ------------ -----------
1 5 12 3
никак не соображу как трансформировать в такой вид. заранее благодарю.


PIVOT вам поможет http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx



или


select   id_product,

           qty_type1 =case  when <.....>  then <,,,,> else end

           qty_type2 =case when  <..... >  then   <....>   else end 

from  mytable
23 июн 14, 00:33    [16204095]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
yaxta,

как минимум не хватает группировки и агрегатов вокруг кейсов.
23 июн 14, 05:22    [16204466]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
begin

if object_id('##t') is null
drop table ##t ;

create table ##t(
id_product int,
qty int,
type int);
declare @aType int;
declare @SQL nvarchar(max);


insert into ##t (id_product,qty,type) values
(1,5,1),
(1,12,2),
(1,3,3),
(2,15,1),
(2,2,2),
(2,4,4);


set @Sql='select id_product';

DECLARE my_cursor CURSOR
FOR select distinct [TYPE] from ##t
OPEN my_cursor;

FETCH NEXT FROM my_cursor INTO @aType
WHILE @@fetch_status = 0
BEGIN

set @Sql=@Sql+' ,sum (case when type='+cast(@aType as varchar(20))+' then qty else null end) as qty_type'+cast(@aType as varchar(20));

FETCH NEXT FROM my_cursor INTO @aType
END

CLOSE my_cursor
DEALLOCATE my_cursor


set @Sql=@Sql+' from ##t group by id_product;'

execute sp_executesql @Sql;

end;
23 июн 14, 08:18    [16204557]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
west74, Картинка с другого сайта.

В Челябинске прогеры настолько суровы что JOIN-ы делают через курсоры.

west74, забудьте про курсоры, навсегда.

Боже, что я вижу, глобальные времянки ##.
23 июн 14, 09:41    [16204750]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Добрый Э - Эх
yaxta,

как минимум не хватает группировки и агрегатов вокруг кейсов.


declare @test table 
(id int ,
 qty int, 
 type int)

insert into @test
(id,qty,type)
select 1,5,1
union all
select 1,12,2
union all
select 1,3,3

----1 й  
select id,
sum(CASE   WHEN qty <=3 THEN qty  ELSE 0 END) as qty_type1,
sum(CASE   WHEN qty <=10 and qty>4 THEN qty  ELSE 0 END) as qty_type2,
sum(CASE   WHEN qty>10  THEN qty ELSE 0 END) as qty_type3 
FROM @test
group by id



id          qty_type1   qty_type2   qty_type3
----------- ----------- ----------- -----------
1           3           5           12

(строк обработано: 1)



-----2 й
select id,
[qty_type1]=case 	when 	qty <=3 then qty	
			                   else 	0
				end,
[qty_type2]=case 	when 	qty <=10 and qty>4 then 	qty
			                   else 	0
				end,
[qty_type3]=case 	when 	 qty>10  then 	qty
			                   else 	0
				end from @test




id          qty_type1   qty_type2   qty_type3
----------- ----------- ----------- -----------
1           0           5           0
1           0           0           12
1           3           0           0

(строк обработано: 3)
23 июн 14, 09:44    [16204766]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
Mnior
west74, Картинка с другого сайта.

В Челябинске прогеры настолько суровы что JOIN-ы делают через курсоры.

west74, забудьте про курсоры, навсегда.

Боже, что я вижу, глобальные времянки ##.



Аха :)
В Челябинске делают сурово и один раз.
варианты с case будете рихтовать безконечо при каждой смене условий.

"Курсор" не есть зло, главное применять правильно.
23 июн 14, 12:13    [16205666]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
west74
"Курсор" не есть зло, главное применять правильно.
Вот именно. Динамический запрос с кучей case'ов можно сформировать и без курсора.
23 июн 14, 12:35    [16205782]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
arzamas16
Member

Откуда: Кишинёв
Сообщений: 5
Можно попробовать функцию PIVOT

select id_product , qty_type1, qty_type2, qty_type3 from
(
SELECT id_product,'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,
qty
from your_table ) as src
pivot
(max(qty) for col in (qty_type1,qty_type2,qty_type3) ) as PVT


Это мой первый ответ на вашем форуме ,так что сильно не пинайте,ежель что не так
23 июн 14, 14:36    [16206684]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
west74
"Курсор" не есть зло, главное применять правильно.
1. west74, вы как раз неправильно применили.
2. Да Зло, пачти адназначнае.
23 июн 14, 15:13    [16206983]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
arzamas16
Member

Откуда: Кишинёв
Сообщений: 5
arzamas16
Можно попробовать функцию PIVOT

select id_product , qty_type1, qty_type2, qty_type3 from
(
SELECT id_product,'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,
qty
from your_table ) as src
pivot
(max(qty) for col in (qty_type1,qty_type2,qty_type3) ) as PVT


Это мой первый ответ на вашем форуме ,так что сильно не пинайте,ежель что не так



Ну а если количество полей будет варьировать можно так

declare
@col nvarchar(max);
declare @cmd nvarchar(max);
select @col=isnull(@col + ', ', '') + '[' + T.COL + ']' from
(select distinct 'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL from your_table) as T
set @cmd='
select id_product ,'+@col+' from
(
SELECT id_product,''qty_type''+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,qty from your_table) as src
pivot
(max(qty) for col in ('+@col+') ) as PVT'
exec (@cmd)
23 июн 14, 17:13    [16208038]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
arzamas16
arzamas16
Можно попробовать функцию PIVOT

select id_product , qty_type1, qty_type2, qty_type3 from
(
SELECT id_product,'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,
qty
from your_table ) as src
pivot
(max(qty) for col in (qty_type1,qty_type2,qty_type3) ) as PVT


Это мой первый ответ на вашем форуме ,так что сильно не пинайте,ежель что не так



Ну а если количество полей будет варьировать можно так

declare
@col nvarchar(max);
declare @cmd nvarchar(max);
select @col=isnull(@col + ', ', '') + '[' + T.COL + ']' from
(select distinct 'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL from your_table) as T
set @cmd='
select id_product ,'+@col+' from
(
SELECT id_product,''qty_type''+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,qty from your_table) as src
pivot
(max(qty) for col in ('+@col+') ) as PVT'
exec (@cmd)
1. На форуме есть тег SRC
2. T.COL теоретически может содержать внутри себя квадратную скобку --> '['+T.COL+']' лучше заменить на QUOTENAME(T.COL)
3. Конструкция select @col=isnull(@col + ', ', '') + ... FROM ...
недокументирована и не всегда стабильно работает. Поэтому лучше её не применять.
Кстати, а где же ORDER BY? Думаете, порядок неважен? Может быть
4. Все переменные юникодные --> литералы должны предваряться буквой N

Я, правда, не углублялся в логику. Бросил поверхностный взгляд.
23 июн 14, 17:27    [16208124]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
arzamas16
Member

Откуда: Кишинёв
Сообщений: 5
iap
arzamas16
пропущено...



Ну а если количество полей будет варьировать можно так

declare
@col nvarchar(max);
declare @cmd nvarchar(max);
select @col=isnull(@col + ', ', '') + '[' + T.COL + ']' from
(select distinct 'qty_type'+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL from your_table) as T
set @cmd='
select id_product ,'+@col+' from
(
SELECT id_product,''qty_type''+cast(row_number() over(partition by id_product order by type) as varchar(11)) COL,qty from your_table) as src
pivot
(max(qty) for col in ('+@col+') ) as PVT'
exec (@cmd)
1. На форуме есть тег SRC
2. T.COL теоретически может содержать внутри себя квадратную скобку --> '['+T.COL+']' лучше заменить на QUOTENAME(T.COL)
3. Конструкция select @col=isnull(@col + ', ', '') + ... FROM ...
недокументирована и не всегда стабильно работает. Поэтому лучше её не применять.
Кстати, а где же ORDER BY? Думаете, порядок неважен? Может быть
4. Все переменные юникодные --> литералы должны предваряться буквой N

Я, правда, не углублялся в логику. Бросил поверхностный взгляд.


1 Виноват , не успел FAQ прочитать
2 Согласен , можно и QUOTENAME() применить
3 Пока не подводила,а насчет order by ,он же здесь -> row_number() over(partition by id_product order by type)
4 Вы правы , но честно признаться я редко это делаю( так как до сих пор проблем с литералами не было )
23 июн 14, 19:00    [16208584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
arzamas16
iap
пропущено...
1. На форуме есть тег SRC
2. T.COL теоретически может содержать внутри себя квадратную скобку --> '['+T.COL+']' лучше заменить на QUOTENAME(T.COL)
3. Конструкция select @col=isnull(@col + ', ', '') + ... FROM ...
недокументирована и не всегда стабильно работает. Поэтому лучше её не применять.
Кстати, а где же ORDER BY? Думаете, порядок неважен? Может быть
4. Все переменные юникодные --> литералы должны предваряться буквой N

Я, правда, не углублялся в логику. Бросил поверхностный взгляд.


1 Виноват , не успел FAQ прочитать
2 Согласен , можно и QUOTENAME() применить
3 Пока не подводила,а насчет order by ,он же здесь -> row_number() over(partition by id_product order by type)
4 Вы правы , но честно признаться я редко это делаю( так как до сих пор проблем с литералами не было )
3. Прикалываетесь? Это всего лишь влияет на номер, но не на порядок записей.
По номеру же ORDER BY нет.
24 июн 14, 09:29    [16210005]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
arzamas16
пропущено...


1 Виноват , не успел FAQ прочитать
2 Согласен , можно и QUOTENAME() применить
3 Пока не подводила,а насчет order by ,он же здесь -> row_number() over(partition by id_product order by type)
4 Вы правы , но честно признаться я редко это делаю( так как до сих пор проблем с литералами не было )
3. Прикалываетесь? Это всего лишь влияет на номер, но не на порядок записей.
По номеру же ORDER BY нет.
4. Тем по этому поводу на форуме очень много.
Так что нарвётесь рано или поздно.
24 июн 14, 09:31    [16210009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
arzamas16
Member

Откуда: Кишинёв
Сообщений: 5
iap
iap
пропущено...
3. Прикалываетесь? Это всего лишь влияет на номер, но не на порядок записей.
По номеру же ORDER BY нет.
4. Тем по этому поводу на форуме очень много.
Так что нарвётесь рано или поздно.


Да , но ведь сочетания значений в секционированном столбце и столбце ORDER BY уникальны(или я что то не так понял из условий задачи).

id_product qtytype
1 5 1
1 12 2
1 3 3
2 4 1
2 6 2


Я читал Общие замечания ->
http://msdn.microsoft.com/ru-ru/library/ms186734.aspx ,но , пока что все работало

Но, все равно спасибо за конструктивную критику , надо бы перепроверить свой скрипты ....
24 июн 14, 11:23    [16210659]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить