Нужна настройка в SQL Server - PullRequest
1 голос
/ 20 ноября 2011
Tbl 1

ID Name Email
1  A    a@b.c
2  B    b@c.d

Tbl2

ID Related_ID Value Name
1  1          Z     Name1
2  1          Y     Name2
3  2          X     Name1
4  2          W     Name2
5  2          G     Name3

Я могу написать запрос, чтобы показать

ID Name Email Value1
1  A    a@b.c Z
1  A    a@b.c Y   

Как я могу написать так, чтобы это стало как

ID Name Email Value1 Value2
1  A    a@b.c Z      Y
2  B    b@c.d X      W

Ответы [ 3 ]

0 голосов
/ 21 ноября 2011

Вот пример, чтобы получить то, что вы хотите, используя динамический sql.

Обратите внимание, что тест CTE и временная таблица # tmp2 должны соответствовать вашим исходным таблицам.

create table #tmp (ID int, Related_ID int, Value nvarchar(50), Name nvarchar(50), rn int)
delete #tmp

create table #tmp2 (ID int, Name nvarchar(50), Email nvarchar(50))
delete #tmp2

;with test(ID, Related_ID, Value, Name)
as
(
select 1,  1,          'Z',     'Name1'
union all
select 2,  1,          'Y',     'Name2'
union all
select 3,  2,          'X',     'Name1'
union all
select 4,  2,          'W',     'Name2'
union all
select 5,  2,          'G',     'Name3'
)

insert into #tmp
select *, row_number() OVER (partition by Related_ID order by ID) as rn
from test

insert into #tmp2
select 1,  'A',    'a@b.c'
union all
select 2,  'B',    'b@c.d'


declare @d nvarchar(MAX)
        ,@e nvarchar(MAX)

SET     @d = 'select a.ID, a.Name, a.Email '
SET     @e =   ',min(case b.rn when >rn< then Value else null end) as [Value>rn<]'

select  @d = @d + (
select t from(
select  distinct replace(@e,'>rn<', b.rn) as [text()]
from    #tmp b
for xml path('')) c(t)
)

set     @d = @d + '
from    #tmp2 a
join    #tmp b
    on  a.ID = b.Related_ID
  group by a.ID, a.Name, a.Email'

exec sp_executesql @d

drop table #tmp
drop table #tmp2
0 голосов
/ 21 ноября 2011
declare @t1 table(id int, name varchar(20), email varchar(32)) 
declare @t2 table(id int, related_id int, value varchar(10), name varchar(10))

insert @t1 values(1,'A', 'a@b.c')
insert @t1 values(2,'B', 'b@c.d')

insert @t2 values(1, 1, 'Z', 'Name1')
insert @t2 values(2, 1, 'Y', 'Name2')
insert @t2 values(3, 2, 'X', 'Name1')
insert @t2 values(4, 2, 'W', 'Name2')
insert @t2 values(5, 2, 'G', 'Name3')

;with a as
(
select value, related_id, ROW_NUMBER() over(PARTITION BY related_id order by value desc) rn
from @t2
), b as
(
select value, related_id, rn from a where rn in (1,2)
)
select t5.ID, t5.Name, t5.Email, t3.value Value1,  t4.value Value2 
from @t1 t5
join b t3
on t3.related_id = t5.id and t3.rn = 1
join b t4
on t4.related_id = t5.id and t4.rn = 2

Результат:

ID     Name       Email  Value1   Value2
------ ------ ---------- -------- ----------
1      A      a@b.c      Z        Y
2      B      b@c.d      X        W
0 голосов
/ 20 ноября 2011

Это можно сделать с помощью оператора PIVOT.
Вот несколько ссылок, на которые вы можете посмотреть.
http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...