2009-11-02 8 views
0

je table nom de base de données « retard de train, avec des colonnesQuestion SQL: Comment faire pivoter plusieurs résultats sur une seule ligne?

train number(int), 
DelayTime(int), 
DelayReason(nchar) 

de sorte que le train peut avoir plus d'un DelayTime pour chaque raison de retard, par exemple:

trainnumber,Delaytime,DelayReason 
1   ,5 sec ,x 
1   ,10 sec ,Z 
1   ,70 sec ,TY 

Je veux créer un rapport de cristal avec la conception suivante:

trainnumber, delaytime 1,delay reason 1 ,delaytime 2, delay reason 2,delaytime 3,delay reason 3 

Mais je ne sais pas la requête qui me obtenir ce résultat

.

J'ai essayé:

select delaytime from dbo.traindelay 

Mais la sortie ressemble à ceci:

Delaytime 
5 
10 
70 

Et je ne veux pas. Je veux quelque chose comme ceci:

delaytime1 ,delaytime2 ,delaytime3 
+0

Y aura-t-il toujours trois retards par train? Est-il possible que certains trains ne soient jamais retardés? Alors que d'autres peuvent être retardés plus fréquemment? – APC

+0

thnx tvanfoson pour l'édition, mais je veux des réponses: D: D – hatemGamil

+0

@APC i peut-être pas du tout dalays ou peut être 1 ou 2 ou 3 mais pas plus de 3 retards thnx – hatemGamil

Répondre

0

D'abord, je vais proposer une nouvelle structure en ajoutant une colonne appelée Id maintenant vous avez 2 tables:

  • Train (int Id, Nom de chaîne)
  • TrainDelay (int Id, int TrainId, int DelayTime, nchar DelayReason

La requête SQL d'avoir un maximum de 3 retards par train est:

select 
    t.Name, 
    d1.DelayTime as Delay1, 
    d1.DelayReason as Reason1, 
    d2.DelayTime as Delay2, 
    d2.DelayReason as Reason2, 
    d3.DelayTime as Delay3, 
    d3.DelayReason as Reason3, 
from Train as t 
left join TrainDelay as d1 on d1.TrainId = t.Id 
left join TrainDelay as d2 on d2.TrainId = t.Id and d2.Id > d1.Id 
left join TrainDelay as d3 on d3.TrainId = t.Id and d3.Id > d2.Id 

Notez que si vous avez plus de 3 retards pour le même train, vous obtiendrez plusieurs résultats par train avec des enregistrements dupliqués. Vous pouvez ajouter plus de jointures mais cela deviendrait extrêmement lent si votre table est grande.

+0

cela fonctionne Manitra merci beaucoup mais je veux demander une autre chose que je veux afficher le rapport de cristal comme ceux-ci j'ai 11 raison statique dans la base de données et je veux le faire ressembler à table par exemple raison 1, raison 2, raison 3 delay1 0, 5, 6 Delay2 4, 6, 9 Delay3 5, 3, 1 je veux une requête pour le faire – hatemGamil

+0

si cette réponse est ok, le marquer comme 'bonne réponse' et demandez à votre deuxième question dans un autre Thr ead :) Il serait plus facile de le lire. –

+0

N'est-ce pas clair ce que vous voulez vraiment. Peut-être que vous devriez éditer votre premier message pour clarifier ce que vous voulez réellement. –