Using conditional aggregation:
select
id_number
, bk_no
, Res1 = max(case when rn = 1 then Res end)
, Res2 = max(case when rn = 2 then Res end)
from (
select *
, rn = row_number() over (partition by id_number, bk_no order by res)
from t
) sub
group by id_number, bk_no
rextester demo: http://rextester.com/DFCC86645
returns:
+-----------+-------+---------+---------+
| id_number | bk_no | Res1 | Res2 |
+-----------+-------+---------+---------+
| LUC00003 | BK001 | CLARETH | MARC |
| LUC00009 | BK001 | CLARETH | MICHAEL |
+-----------+-------+---------+---------+
dynamic pivot()
version:
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
',' + quotename('Res'
+convert(varchar(10),row_number() over (
partition by id_number, bk_no
order by res
))
)
from t
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'');
select @sql = '
select id_number, bk_no, ' + @cols + '
from (
select
id_number
, bk_no
, Res
, rn=''Res'' + convert(varchar(10),row_number() over (
partition by id_number, bk_no
order by res
))
from t
) as a
pivot (max([Res]) for [rn] in (' + @cols + ') ) p';
select @sql as CodeGenerated;
exec sp_executesql @sql;
returns:
+-----------------------------------------------------------------+
| CodeGenerated |
+-----------------------------------------------------------------+
| select id_number, bk_no, [Res1],[Res2] |
| from ( |
| select |
| id_number |
| , bk_no |
| , Res |
| , rn='Res' + convert(varchar(10),row_number() over ( |
| partition by id_number, bk_no |
| order by res |
| )) |
| from t |
| ) as a |
| pivot (max([Res]) for [rn] in ([Res1],[Res2]) ) p |
+-----------------------------------------------------------------+
+-----------+-------+---------+---------+
| id_number | bk_no | Res1 | Res2 |
+-----------+-------+---------+---------+
| LUC00003 | BK001 | CLARETH | MARC |
| LUC00009 | BK001 | CLARETH | MICHAEL |
+-----------+-------+---------+---------+