Как подменить занчения для PIVOT_а ?

Greenhorn
Дата: 12.02.2010 10:42:42
Добрый день.

Есть таблица с данными и справочник с описанием значений.
declare @t table( [name] sysname, node sysname, val_id int) -- Таблица с данными
declare @v table( id int, descr nvarchar(50) );             -- Справочник. @t.[val_id] -> @v.[id]

insert into @v
select 1, 'id № 1'   union all
select 2, 'id № Два' union all
select 3, 'id = 3'   

insert into @t
select 'Name_1', 'N1', 3 union all
select 'Name_1', 'N3', 2 union all
select 'Name_2', 'N2', 2 union all
select 'Name_3', 'N3', 1 union all
select 'Name_3', 'N2', 3 union all
select 'Name_3', 'N1', 2 

select [name], [N1],[N2],[N3]
from (
  select [name], [node], val_id
  from @t 
) as t
pivot(
  min(val_id) for [node] in ([N1],[N2],[N3])
) as pv
--------- Результат
name      N1          N2          N3
--------- ----------- ----------- -----------
Name_1    3           NULL        2
Name_2    NULL        2           NULL
Name_3    2           3           1
---------
Нужно заменить [val_id] для полей [N1] [N2] [N3] на соответствующий @v.[descr].
Как сие осуществить ?
Glory
Дата: 12.02.2010 10:46:13
И в чем проблема сделать join между двумя таблицами ?
Greenhorn
Дата: 12.02.2010 10:49:40
Glory
И в чем проблема сделать join между двумя таблицами ?

Нужно получить результирующую таблицу вида
name     N1          N2          N3
-------- ----------- ----------- -----------
Name_1   id = 3      NULL        id № Два
Name_2   NULL        id № Два    NULL
Name_3   id № Два    id = 3      id № 1
Как мне может помочь join ?
Glory
Дата: 12.02.2010 10:51:41
Greenhorn

Как мне может помочь join ?


Очень просто. Нет способа одноворемменно получить данные из двух таблиц, кроме как без использования join-а. Вы разве не знали ?
Greenhorn
Дата: 12.02.2010 10:56:55
Glory
Greenhorn

Как мне может помочь join ?


Очень просто. Нет способа одноворемменно получить данные из двух таблиц, кроме как без использования join-а. Вы разве не знали ?

Конечно, знаю. Вот только как выборку из join_а впихнуть в занечение полей, пока не понял.

Вы можете на приведенном примере показать ?
Greenhorn
Дата: 12.02.2010 11:34:24
Greenhorn
Glory
Greenhorn

Как мне может помочь join ?


Очень просто. Нет способа одноворемменно получить данные из двух таблиц, кроме как без использования join-а. Вы разве не знали ?

Конечно, знаю. Вот только как выборку из join_а впихнуть в занечение полей, пока не понял.

Вы можете на приведенном примере показать ?


Во, дошло...
select [name], 
  (select top 1 descr from @v as v where v.id = [N1]) as [N1], 
  (select top 1 descr from @v as v where v.id = [N2]) as [N2],
  (select top 1 descr from @v as v where v.id = [N3]) as [N3]
from (
  select [name], [node], val_id--, v.descr
  from @t as t
) as t
pivot(
  min(val_id) for [node] in ([N1],[N2],[N3])
) as pv

И JOIN оказался не нужным.
Паганель
Дата: 12.02.2010 11:46:58
select *
from (
  select [name], [node], val_id
  from @t 
) as t
pivot(
  min(val_id) for [node] in ([N1],[N2],[N3])
) as pv
left join @v v1 on v1.id = pv.N1
left join @v v2 on v2.id = pv.N2
left join @v v3 on v3.id = pv.N3
?
Greenhorn
Дата: 12.02.2010 12:00:01
Паганель
select *
from (
  select [name], [node], val_id
  from @t 
) as t
pivot(
  min(val_id) for [node] in ([N1],[N2],[N3])
) as pv
left join @v v1 on v1.id = pv.N1
left join @v v2 on v2.id = pv.N2
left join @v v3 on v3.id = pv.N3
?


То, что нужно...
Спасибо...
Glory
Дата: 12.02.2010 12:24:42
Greenhorn

И JOIN оказался не нужным.

А если думать хорошо, то все совсем наоборот

declare @t table( [name] sysname, node sysname, val_id int) -- Таблица с данными
declare @v table( id int, descr nvarchar(50) );             -- Справочник. @t.[val_id] -> @v.[id]

insert into @v
select 1, N'id № 1'   union all
select 2, N'id № Два' union all
select 3, N'id = 3'   

insert into @t
select 'Name_1', 'N1', 3 union all
select 'Name_1', 'N3', 2 union all
select 'Name_2', 'N2', 2 union all
select 'Name_3', 'N3', 1 union all
select 'Name_3', 'N2', 3 union all
select 'Name_3', 'N1', 2 

select [name], [N1],[N2],[N3]
from (
  select a.[name], a.[node], b.descr
  from @t a inner join @v b on a.val_id = b.id
) as t
pivot(
  min(descr) for [node] in ([N1],[N2],[N3])
) as pv
Greenhorn
Дата: 12.02.2010 14:52:41
Glory,

Не догадывался, что MIN() можно использовать для строк ...

Огромное спасибо ...