2009-11-02 39 views
0

我在數據庫名稱「列車晚點表,其中列SQL問題:如何將多個結果轉換爲單行?

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

所以火車可爲每個延遲的原因不止一個delaytime,例如:

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

我想創建Crystal報表具有以下設計:

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

但我不知道查詢,這將讓我這個結果

我已經試過這樣:

select delaytime from dbo.traindelay 

但輸出看起來是這樣的:

Delaytime 
5 
10 
70 

而且我不希望出現這種情況。我想是這樣的:

delaytime1 ,delaytime2 ,delaytime3 
+0

每列火車總是會有三次延誤嗎?有沒有可能有些列車永遠不會被推遲?其他人可能會更頻繁地推遲? – APC

+0

編輯日Thnx tvanfoson,但我想答案:d:d – hatemGamil

+0

@APC 我可能沒有dalays在所有 也可能是1或2或3 但不超過3個延遲 日Thnx – hatemGamil

回答

0

首先,我將通過添加一個名爲ID列提出了一種新的結構,現在你有2個表:

  • 列車(INT標識,字符串名稱)
  • TrainDelay(INT標識,INT TrainId,INT DelayTime,NCHAR DelayReason

SQL查詢以具有最大每列車3個的延遲是:

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 

請注意,如果您對同一列火車的延遲超過3個,那麼每個火車的重複記錄數就會有多個結果。你可以添加更多的連接,但如果你的表很大,它會變得非常慢。

+0

它的工作原理manitra非常感謝你很多,但我想問另一件事,我想要顯示這些水晶報告,像這些我有11靜態的原因在數據庫中,我想使它看起來像表 例如,原因1,原因2,原因3 delay1 0,5, 6 延遲2 4,6,9 DELAY3 5,3,1 我想查詢要做到這一點 – hatemGamil

+0

如果這個答案是確定的,標記爲「正確答案」,並問你的第二個問題在其他THR ead :)閱讀它會更容易。 –

+0

是不是很清楚你真正想要什麼。也許你應該編輯你的第一篇文章,以澄清你想要的結果。 –