3

J'ai la sortie suivante dans une requête.comment faire pivoter les données SQL sans agréger une colonne

SKILL            LEVEL   SCORERANGE 
----------------------------------------------------------------------------- 
Stunts            LOW   0.0 - 4.0 
Stunts            MED   3.0 - 7.0 
Stunts            HI    6.0 - 10.0 
Pyramids           LOW   0.0 - 4.0 
Pyramids           MED   3.0 - 7.0 
Pyramids           HI    6.0 - 10.0 
Tosses            LOW   0.0 - 4.0 
Tosses            MED   3.0 - 7.0 
Tosses            HI    6.0 - 10.0 
Standing Tumbling         LOW   0.0 - 4.0 
Standing Tumbling         MED   3.0 - 7.0 
Standing Tumbling         HI    6.0 - 10.0 
Running Tumbling         LOW   0.0 - 4.0 
Running Tumbling         MED   3.0 - 7.0 
Running Tumbling         HI    6.0 - 10.0 
Jumps            LOW   0.0 - 4.0 
Jumps            MED   3.0 - 7.0 

Je veux PIVOTER ces données sans rien agréger. Je veux donc un résultat qui montre qu'une seule ligne pour chaque compétence et fait pivoter le niveau, quelque chose comme ça ...

SKILL            LOWRANGE  MEDRANGE  HIRANGE 
Stunts            0.0 - 4.0  3.0 - 7.0  6.0 - 10.0 
Pyramids           0.0 - 4.0  3.0 - 7.0  6.0 - 10.0 
Tosses            0.0 - 4.0  3.0 - 7.0  6.0 - 10.0 
Standing Tumbling         0.0 - 4.0  3.0 - 7.0  6.0 - 10.0 
Running Tumbling         0.0 - 4.0  3.0 - 7.0  6.0 - 10.0 
... 

J'ai une assez bonne compréhension de la syntaxe de pivot de base mais je me bats avec celui-ci parce que il n'y a rien à agréger dans l'ensemble de résultats.

Pour vous donner quelque chose à essayer de réparer pour moi ...

SELECT SKILL, LOWRANGE, MEDRANGE, HIRANGE 
FROM (SELECT SKILL, [LEVEL], SCORERANGE FROM ScoreRanges) ps 
PIVOT 
    (
     MAX(SCORERANGE) --THIS IS PROBABLY WRONG 
     FOR SCORERANGE IN 
     (
      --SOMETHING GOES HERE 
     ) 
    ) as pvt 

Merci pour votre aide.

Seth

Répondre

4

Comme vous le savez, vous aurez seulement 1 ligne par SKILL, LEVEL combinaison vous pouvez utiliser Max ou Min

SELECT SKILL, [LOW] LOWRANGE, [MED] MEDRANGE, [HI] HIRANGE 
FROM (SELECT SKILL, [LEVEL], SCORERANGE FROM ScoreRanges) ps 
PIVOT (
     MAX(SCORERANGE) 
     FOR LEVEL IN ([LOW], [MED], [HI]) 
    ) as pvt 
1

Vous presque l'avez droit

SELECT SKILL, LOW as LOWRANGE, MED as MEDRANGE, HI as HIRANGE 
FROM (SELECT SKILL, [LEVEL], SCORERANGE FROM ScoreRanges) ps 
PIVOT 
    (
     MAX(SCORERANGE) 
     FOR [LEVEL] IN 
     (
      [LO], [HIGH], [MED] 
     ) 
    ) as pvt 

Voici un exemple vous pouvez exécuter dans la base de données Adventureworks, de sorte que vous pouvez jouer avec cela aussi pour voir comment PIVOT fonctionne

SELECT City, F AS Females, M AS Males 
FROM(
SELECT Gender,City 
FROM HumanResources.Employee AS e 
    INNER join HumanResources.EmployeeAddress AS ea 
    ON e.EmployeeID = ea.EmployeeID 
    INNER join Person.Address AS p 
    ON ea.AddressID = p.AddressID 
    ) AS pivTemp 
PIVOT 
( COUNT(Gender) 
    FOR Gender IN (F,M) 
) AS pivTable 

J'ai aussi utre exemple PIVOT ici: Three different ways of populating variables with configuration values in SQL Server

Questions connexes