2010-06-24 6 views
1

Je veux retourner les trois premiers animaux pour chaque employé en tant que colonnes au lieu de lignes iEPivot sur SQL Server 2010

Owner_ID Pet 
-------------------- 
1  Cat 
1  Dog 
1  Hamster 
2  Cow 
2  Sheep 
3  Dog 

convertir en

Owner_ID Pet1 Pet2 Pet3 
------------------------------------- 
1   Cat Dog Hamster 
2   Cow Sheep null 
3   Dog null null 

Le nom des animaux proviennent d'une recherche table et il peut y avoir un certain nombre d'animaux, mais je veux seulement revenir en haut 3.

Voici ma question:

SELECT Owner,Pet1, Pet2,Pet3 
    FROM 
    (select distinct OwnerID as Owner,glcom.Value as Pets 
    from Owner ,OwnerPets ,Pet  
    where Pet.Type='Furry' 
    and OwnerPets.OwnerID = OwnerID.OwnerID 
    and OwnerPets.PetID = Pet.PetID) AS SourceTable 
PIVOT 
( 
Max(Pets) 
FOR Pets IN (Pet1, Pet2,Pet3) 
) AS PivotTable; 

Malheureusement, il retourne seulement null pour chaque ligne ... donc la sortie que je vois est

Owner_ID Pet1 Pet2 Pet3 
------------------------------------- 
1   null null null 
2   null null null 
3   null null null 

Espérons que c'est un problème commun et que quelqu'un doit avoir résolu déjà.

Merci

+2

WTF est SQL Server 2010? La dernière version est 2008 R2. –

+0

NB: Ma réponse suppose que vous suivez Brent Ozar en appelant 2008 R2 SQL Server 2010! http://www.brentozar.com/archive/2009/02/sql-server-2010-features-leaked/ –

+0

:) oui c'est le cas. – sfomate

Répondre

2

Si je comprends correctement, vous pouvez utiliser ROW_NUMBER() over (partition by Owner_ID order by ...) sur votre requête puis en utilisant pivot ceux-ci.

L'exemple suivant.

WITH Unpivoted AS 
(
SELECT X.*, ROW_NUMBER() over (partition by Owner_ID order by Pet) AS RN 
    FROM (VALUES 
(1,  'Cat') , 
(1,  'Dog') , 
(1,  'Hamster') , 
(1,  'Rhino'), 
(1,  'Zebra'), 
(2,  'Cow') , 
(2,  'Sheep') , 
(3,  'Dog') 
) AS X (Owner_ID, Pet) 
) 

SELECT Owner_Id, [1] AS Pet1, [2] AS Pet2,[3] AS Pet3 FROM Unpivoted 
PIVOT 
( 
Max(Pet) 
FOR RN IN ([1], [2],[3]) 
) AS PivotTable; 

Retours

Owner_Id Pet1 Pet2 Pet3 
----------- ------- ------- ------- 
1   Cat  Dog  Hamster 
2   Cow  Sheep NULL 
3   Dog  NULL NULL 
+0

J'avais essayé le numéro de ligne plus tôt mais le problème que je rencontre est si un propriétaire a deux chats, que j'ai besoin d'un numéro distinct et d'un numéro de ligne qui ne fonctionne pas. – sfomate

+0

Cela aide à résoudre le problème pour l'instant, je traiterai des ensembles uniques plus tard. – sfomate