如何转换 table 并获取以下格式的数据

How to pivot table and get data in below format

目前我有以下原样格式的数据

并要求获取以下格式

我使用的是SQL2008 R2版本

我花了一些时间使用 Pivot \ Unpivot 使它工作,但没有成功。如果有人能帮我解开这个谜就太好了

您可以进行条件聚合:

SELECT
    RegionalManager,
    ATVScore    = MAX(CASE WHEN MeasureName = 'ATVScore' THEN Score END),
    ABCScore    = MAX(CASE WHEN MeasureName = 'ABCScore' THEN Score END),
    Agg,
    ATVRank     = MAX(CASE WHEN MeasureName = 'ATVScore' THEN [Rank] END),
    ABCRank     = MAX(CASE WHEN MeasureName = 'ABCScore' THEN [Rank] END)
FROM tbl 
GROUP BY
    RegionalManager, Agg

如果 MeasureName 的值未知,则需要动态执行:

DECLARE @sql NVARCHAR(MAX) = ''

SELECT @sql = @sql +
'SELECT
    RegionalManager' + CHAR(10)

SELECT @sql = @sql +
'   , MAX(CASE WHEN MeasureName = ''' + MeasureName  + ''' THEN Score END) AS' + QUOTENAME(MeasureName) + CHAR(10)
FROM(
    SELECT DISTINCT MeasureName FROM tbl
) t

SELECT @sql = @sql +
'   , Agg' + CHAR(10)

SELECT @sql = @sql +
'   , MAX(CASE WHEN MeasureName = ''' + MeasureName  + ''' THEN [Rank] END) AS' + QUOTENAME(MeasureName) + CHAR(10)
FROM(
    SELECT DISTINCT MeasureName FROM tbl
) t

SELECT @sql = @sql +
'FROM tbl
GROUP BY
    RegionalManager, Agg'

EXECUTE sp_executesql @sql

尝试

 ;with a as (select * , row_number() over (order by (select 1)) r from @t),

 b as (select * , row_number() over (partition by agg,RManager order by r) r1 from a)

select t.RManager,t.Score,t1.Score,t.Agg,t.Rank,t1.Rank
from b t join (select * from b where r1=2  ) t1 on  t.Agg=t1.Agg and t.RManager=t1.RManager
where t.r1=1 order by agg desc

数据

declare @t table (RManager char(1),MeasureName varchar(10),Score float,Agg varchar(5),  [Rank] int)
insert into @t (RManager,MeasureName,Score,Agg,[Rank])
values('A', 'ATVScore', 0.03,   'WTD',  1),
('B',   'ATVScore', 0.05,   'WTD',  2),
('C',   'ATVScore', 0.12,   'WTD',  3),
('A',   'ATVScore', 34, 'MTD',  2),
('B','ABCScore',    12  ,'MTD', 3),
('C',   'ABCScore', 112,    'MTD',  1),
('A',   'ABCScore', 23, 'WTD',  3),
('B',   'ABCScore', 34, 'WTD',  2),
('C',   'ABCScore', 45, 'WTD',  1),
('A',   'ABCScore', 123 ,'MTD', 1),
('B',   'ABCScore', 34  ,'MTD', 3),
('C',   'ABCScore', 45  ,'MTD', 2)