2010-08-24 5 views
0

S'il vous plaît pardonnez-moi si cela a déjà été répondu.Sql serveur 2000 requête pivot

Je cherche des conseils sur la façon de créer une requête de type pivot ou intercalaire.

J'ai une table qui ressemble aime ça

Vessel Date Inspector 
A  02/05/10 Morris 
B  05/20/10 Clouseau 
A  07/25/10 Gadget 

J'ai besoin que les résultats soient ressembler à ce

Vessel Jan Feb  Mar  April May June July Aug Sept Oct Nov Dec 
    A   Morris        Gadget 
    B         Clouseau 

Espérons que logique. J'espère que quelqu'un pourra me donner un conseil ou m'aider à me lancer dans cette aventure.

Merci

+0

Que devrait-on faire si vous avez deux inspecteurs pour le même mois et le même navire? – Timwi

+0

Je pense qu'ils voudront une liste séparée par des virgules. Mais la BA ne pense pas que cela arrivera. – gswanson

Répondre

2
Select Vessel 
    , Min (Case When Month([Date]) = 1 Then Inspector End) As Jan 
    , Min (Case When Month([Date]) = 2 Then Inspector End) As Feb 
    , Min (Case When Month([Date]) = 3 Then Inspector End) As Mar 
    ... 
    , Min (Case When Month([Date]) = 12 Then Inspector End) As Dec 
From Table 
Group By Vessel 

Vous devez déclarer statiquement les colonnes. Il convient de noter que cela ne fonctionnera que pour une seule année. Si ce que vous cherchez est une génération de colonne dynamique (mois), alors essayer de le faire en T-SQL n'est pas la bonne approche car vous ne pouvez le faire qu'avec un SQL dynamique. Au lieu de cela, vous devez utiliser un générateur de rapport ou un composant de niveau intermédiaire pour générer le jeu de résultats.

0

Je ne pense pas que vous avez besoin d'une PIVOT pour cela - il suffit de créer 12 sous-requêtes, une pour chaque mois:

SELECT 
    Vessel, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=1) as Jan, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=2) as Feb, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=3) as Mar, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=4) as Apr, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=5) as May, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=6) as Jun, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=7) as Jul, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=8) as Aug, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=9) as Sep, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=10) as Oct, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=11) as Nov, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=12) as Dec 
FROM (
    SELECT DISTINCT(Vessel) FROM Stuff 
) Tbl 

Vous pouvez faire ce travail pour une année donnée en ajoutant un AND YEAR(Date)=2010 (par exemple) à la fin de chacune des 12 sous-requêtes.