Estou tentando converter dados longos:
ID|SchoolID|Section|RepScore|SportsScore|PartyScore
1 |20 |1 |23.2 |70.2 |42.3
2 |20 |6 |65.2 |75.8 |52.3
3 |20 |7 |77.2 |72.2 |66.3
4 |21 |10 |13.2 |40.2 |72.3
5 |21 |11 |25.2 |55.8 |72.3
6 |21 |12 |37.2 |62.2 |76.3
para dados amplos (estou usando apenas as três primeiras linhas para mantê-lo curto aqui):
SchoolID|RpScr1|RpScr6|RpScr7|SprtScr1|SprtScr6|SprtScr7|Prty1|Prty6|Prty7
20 |23.2 |65.2 |77.2 |70.2 |75.8 |72.2 |42.3 |52.3 |66.3
Eu tentei isso:
DECLARE @cols VARCHAR(1000)
DECLARE @cols2 VARCHAR(1000)
DECLARE @cols3 VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF(( SELECT distinct '], [a' + cast([Section] as varchar)
FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SELECT @cols2 = STUFF(( SELECT distinct '], [b' + cast([Section] as varchar)
FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SELECT @cols3 = STUFF(( SELECT distinct '], [c' + cast([Section] as varchar)
FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SET @sqlquery = 'SELECT * FROM
(SELECT z.Section,z.RepScore,z.SportsScore,z.PartyScore
FROM [dbo].[SchoolData] z) base
PIVOT (Max(RepScore) FOR [Section] IN (' + @cols + ')) AS finalpivot
PIVOT (Max(SportsScore) FOR [Section] IN (' + @cols + ')) AS finalpivot2
PIVOT (Max(PartyScore) FOR [Section] IN (' + @cols + ')) AS finalpivot3'
EXECUTE ( @sqlquery )
Este é o erro que recebo: Msg 8114, Level 16, State 1, Line 7 Erro ao converter o tipo de dados nvarchar para int. Msg 473, Level 16, State 1, Line 7 O valor incorreto "a9" é fornecido no operador PIVOT. Msg 207, Level 16, State 1, Line 8 Nome de coluna inválido 'Section'.
Quando eu tento com apenas um assim:
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF(( SELECT distinct '], [a' + cast([Section] as varchar)
FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SET @sqlquery = 'SELECT * FROM
(SELECT z.Section,z.RepScore,z.SportsScore,z.PartyScore
FROM [dbo].[SchoolData] z) base
PIVOT (Max(RepScore) FOR [Section] IN (' + @cols + ')) AS finalpivot'
Ele funciona para apenas uma coluna e fornece nomes de coluna como este [1],[6],[7]. Mas não funciona para várias colunas como eu preciso. Alguma ideia?
você está procurando por isso,
se você já conhece todos os valores possíveis para Seção + tipo de pontuação, você pode tentar o truque de pivô / unpivot como:
Foi assim que acabei fazendo.