2
votes

Comment faire pivoter plusieurs colonnes dans la même table

J'ai un tableau avec la structure ci-dessous, je dois décompresser la sortie pour obtenir une ligne par ID par PARAMETER et ses RATINGS code>

ID      PARAMETERS
1000    PARAMETER1
1000    PARAMETER2
1000    PARAMETER3
1000    PARAMETER4
1002    PARAMETER1
1002    PARAMETER2
1002    PARAMETER3
1002    PARAMETER4
1007    PARAMETER1
1007    PARAMETER2
1007    PARAMETER3
1007    PARAMETER4
1015    PARAMETER1
1015    PARAMETER2
1015    PARAMETER3
1015    PARAMETER4
1019    PARAMETER1
1019    PARAMETER2
1019    PARAMETER3
1019    PARAMETER4

Résultat attendu:

select ID,[parameters] from RATINGS
unpivot
(
[value] for [PARAMETERS] in (PARAMETER1,PARAMETER2,PARAMETER3,PARAMETER4)
) unpvt

Plus tard, je devrai également filtrer pour n'obtenir que les lignes contenant notes 1 et 2 . La sortie doit donc être

ID    PARAMETERS RATING
1000  PARAMETER1  1
1000  PARAMETER3  2
1000  PARAMETER4  1
1002  PARAMETER1  2
1002  PARAMETER4  2
1007  PARAMETER3  2
1007  PARAMETER4  1
1015  PARAMETER1  1
1015  PARAMETER3  1
1019  PARAMETER1  2
1019  PARAMETER1  1
1019  PARAMETER1  1

Je suis en mesure d'obtenir les deux premières colonnes ID et PARAMETERS en utilisant la requête ci-dessous :

ID    PARAMETERS RATING
1000  PARAMETER1  1
1000  PARAMETER2  3
1000  PARAMETER3  2
1000  PARAMETER4  1
1002  PARAMETER1  2
1002  PARAMETER2  3
1002  PARAMETER3  3
1002  PARAMETER4  2
1007  PARAMETER1  3
1007  PARAMETER2  3
1007  PARAMETER3  2
1007  PARAMETER4  1
1015  PARAMETER1  1
1015  PARAMETER2  3
1015  PARAMETER3  1
1015  PARAMETER4  3
1019  PARAMETER1  3
1019  PARAMETER1  2
1019  PARAMETER1  1
1019  PARAMETER1  1

SORTIE:

create table RATINGS(ID INT,PARAMETER1 INT,PARAMETER2 INT,PARAMETER3 INT,PARAMETER4 INT)
insert into RATINGS values(1000,1,3,2,1)
insert into RATINGS values(1002,2,3,3,2)
insert into RATINGS values(1007,3,3,2,1)
insert into RATINGS values(1015,1,3,1,3)
insert into RATINGS values(1019,3,2,1,1)

Quelqu'un pourrait-il me dire comment obtenir le Rating code > colonne?


0 commentaires

3 Réponses :


2
votes

Ajoutez simplement la colonne de valeur:

select ID,[parameters], [rating] = value 
from RATINGS
unpivot
(
[value] for [PARAMETERS] in (PARAMETER1,PARAMETER2,PARAMETER3,PARAMETER4)
) unpvt
where value in (1,2);


0 commentaires

1
votes

Vous pouvez annuler le pivot avec UNION

with parmratings as (

    select id, 'PARAMETERS1' as parameters, parameter1 as rating 
    from ratings
    union
    select id, 'PARAMETERS2' . . . 
)
select * from parmratings where rating < 3

http : //www.sqlfiddle.com/#! 9 / 421f05 / 7

Puis la deuxième partie juste

select id, 'PARAMETERS1' as parameters, parameter1 as rating 
from ratings
union
select id, 'PARAMETERS2' as parameters, parameter2 as rating 
from ratings
union
select id, 'PARAMETERS3' as parameters, parameter3 as rating 
from ratings
union
select id, 'PARAMETERS4' as parameters, parameter4 as rating 
from ratings
order by id, parameters


0 commentaires

1
votes

J'utiliserais CROSS APPLY :

SELECT r.id, rr.PARAMETERS, rr.RATING
FROM ratings r CROSS APPLY
     ( VALUES ([PARAMETERS1], 'PARAMETERS1'), . . .  ) rr(RATING, PARAMETERS)
ORDER BY r.id;


0 commentaires