Il y a 100 exemples de pivot sur SO, donc je voulais montrer une façon de faire cela, ce qui n'est pas aussi bon que pivot, mais fonctionne pour votre instance. Il se peut qu'il ne corresponde pas à l'ensemble de vos données et qu'il soit basé uniquement sur vos exemples de données.
Il convient de noter que vos données de test ne fournissent pas les résultats que vous prétendez qu'ils fournissent. Probablement juste une faute de frappe sur l'encart.
create table #Nodes(
Caption varchar(max),
IP_Address varchar(max),
NodeID varchar(max)
);
insert into #Nodes (Caption, IP_Address, NodeID)
values
('dev-srvr', '10.0.0.1', '29023'),
('prod-srvr', '10.0.2.1', '29056'),
('test-srvr', '10.1.1.1', '29087');
create table #Volumes(
Caption varchar(max),
NodeID varchar(max)
);
insert into #Volumes (NodeID, Caption)
values
('29023', '/'),
('29023', '/boot'),
('29023', '/dev/shm'),
('29023', '/home'),
('29056', '/'),
('29056', '/var'),
('29056', '/opt'),
('29087', '/tmp');
select
n.Caption,
n.IP_Address,
v.Caption as Volume
from #Nodes n
inner join #Volumes v
on n.NodeID=v.NodeID
where IP_Address like '10.0%'
;with cte as(
select
n.Caption,
n.IP_Address,
v.Caption as Volume,
ROW_NUMBER() over (partition by n.caption, IP_Address order by n.caption) as RN
from #Nodes n
inner join #Volumes v
on n.NodeID=v.NodeID
where IP_Address like '10.0%')
select
x.caption,
x.IP_Address,
max(Volume1) as Volume1,
max(Volume2) as Volume2,
max(Volume3) as Volume3,
max(Volume4) as Volume4
from(
select
Caption,
IP_Address,
case when RN = 1 then Volume end as Volume1,
case when RN = 2 then Volume end as Volume2,
case when RN = 3 then Volume end as Volume3,
case when RN = 4 then Volume end as Volume4
from cte) x
group by x.Caption, x.IP_Address
drop table #Nodes
drop table #Volumes
UTILISATION DU PIVOT DYNAMIQUE
create table #Nodes(
Caption varchar(max),
IP_Address varchar(max),
NodeID varchar(max)
);
insert into #Nodes (Caption, IP_Address, NodeID)
values
('dev-srvr', '10.0.0.1', '29023'),
('prod-srvr', '10.0.2.1', '29056'),
('test-srvr', '10.1.1.1', '29087');
create table #Volumes(
Caption varchar(max),
NodeID varchar(max)
);
insert into #Volumes (NodeID, Caption)
values
('29023', '/'),
('29023', '/boot'),
('29023', '/dev/shm'),
('29023', '/home'),
('29056', '/'),
('29056', '/var'),
('29056', '/opt'),
('29087', '/tmp');
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
select
n.Caption,
n.IP_Address,
v.Caption as Volume,
'Volume' + cast(ROW_NUMBER() over (partition by n.caption, IP_Address order by n.caption) as varchar(16)) as Cname
--ROW_NUMBER() over (partition by n.caption, IP_Address order by n.caption) as RN
into #staging
from #Nodes n
inner join #Volumes v
on n.NodeID=v.NodeID
where IP_Address like '10.0%'
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(Cname)
FROM (SELECT DISTINCT Cname FROM #staging) AS Cname
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT Caption, IP_Address, ' + @ColumnName + '
FROM #staging
PIVOT(MAX(Volume)
FOR Cname IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
drop table #Nodes
drop table #Volumes
drop table #staging