如何转换 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)
目前我有以下原样格式的数据
并要求获取以下格式
我使用的是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)