2015-06-09 45 views
0

我有這樣的表:MySQL的跨度多行

Trans Time_In Placard Container Sztp Line Time_Out 
===== ======= ======= ========= ==== ==== ======== 
IN 10:15 254114 CLHU12345 40DH MAE 10:54 <In transaction 
OUT 10:15 254114 MAEU45678 20DR SEA 10:54 <Out Transaction (same placard) 
OUT 10:15 254114 TTNU98765 20DR CHI 10:54 <Out Transaction (same placard) 

IN 11:23 664524 FSCU13479 40RH SEB 11:55 <In transaction 
OUT 11:23 664524 PONU55588 40DR MAB 11:55 <Out Transaction (same placard) 

IN 13:01 542234 TLHU77665 40RH MOL 13:23 <In transaction (no out) 

OUT 13:36 232212 MLHU22341 20DR CMD 13:49 <Out Transaction (no in) 

OUT 14:03 187852 AMFU56041 20DR CMD 14:48 <Out Transaction (no in) 
OUT 14:03 187852 CCLU44112 20DR CHN 14:48 <Out Transaction, same placard (no in) 

那是輸入輸出端子用於刪除貨櫃車的表,有時選擇一個40" 或兩個20" 到柵極出。有時候,一個卡車司機會丟棄一個集裝箱並且空着,所以沒有OUT交易。或者它可能會選擇一個完整的容器,所以沒有IN交易,但只有一兩個OUT,如果他選擇一個40或兩個20。每個標語牌的時間和時間都是一樣的,所以我可以從任何記錄中讀取,所以不用擔心。

關鍵是Time_In + Placard,因爲同一張標牌可以進行多次出入。每次旅行的時間戳完全相同。

我需要這樣的事情結束了:

Trans Time In Placard Cont1  Sztp1 Line1 Cont2  Sztp2 Line2 Cont3  Sztp3 Line3 Time Out 
===== ======= ======= ========= ===== ===== ========= ===== ===== ========= ===== ===== ======== 
IN 10:15 254114 CLHU12345 40DH MAE MAEU45678 20DR SEA TTNU98765 20DR CHI 10:54 
IN 11:23 664524 FSCU13479 40RH SEB PONU55588 40DR MAB null  null null 11:55 
IN 13:01 542234 TLHU77665 40RH MOL null  null null null  null null 13:23 
OUT 13:36 232212 MLHU22341 20DR CMD null  null null null  null null 13:49 
OUT 14:03 187852 AMFU56041 20DR CMD CCLU44112 20DR CHN null  null null 14:48 

感謝您的幫助。

更新:剛剛重寫了整個問題,因爲它不夠清楚。標題也是錯誤的,不是多行到多行,而是反過來:多行到多行。對不起。

+0

40&DH應該是單獨的列 – Strawberry

+0

不,這是大小/類型,是4個字符。 –

+0

是的,應該是單獨的列 - 大小和類型 – Strawberry

回答

0

我認爲在MySQL存儲過程中傳遞遊標操作或者您的編程語言可以更高效。將所有這些複雜的關係合併到一個查詢中並不容易實現,審查或維護。

這是另一種使用臨時表來構建和保存結果的解決方案,其中t1是您的原始數據表,而t3是結果表。

drop table if exists t3; 

create temporary table t3 (placecard int, Trans varchar(10), TimeIn varchar(10), ContIn varchar(20), InSize varchar(10), InLine varchar(10), ContOut1 varchar(20), 
    ContSize1 Varchar(10), ContLine1 varchar(10), ContOut2 varchar(20), ContSize2 varchar(10), ContLine2 Varchar(10), TimeOut varchar(10)); 


insert into t3 
(placecard, timein, timeout) 
select placecard, min(timein), max(timeout) from t1 
group by placecard; 


update t3 
join t1 
on t3.placecard = t1.placecard and t3.timein = t1.timein and t1.transaction='IN' 
set trans ='IN', contin = t1.Container, InSize = t1.Size, InLine = t1.Line 
where t3.placecard>0; 

update t3 
join t1 
on t3.placecard= t1.placecard and t1.transaction='OUT' 
set contOut1 = t1.Container , ContLine1 = t1.line , ContSize1 = t1.size 
where t3.placecard>0; 

update t3 
join t1 
on t3.placecard= t1.placecard and t1.transaction='OUT' and t3.contOut1 <> t1.Container 
set contOut2 = t1.Container , ContLine2 = t1.line , ContSize2 = t1.size 
where t3.placecard>0 ; 


select * from t3; 

您可以將其構建到存儲過程並添加參數來限制範圍。

或者您可以將其構建到更新計劃表的計劃作業中。

+0

無論哪個更方便我都會使用。該查詢將在BIRT報告中使用,所以我不確定它如何在eclipse中運行,如果它必須在運行中創建和刪除表。這是我正在尋找一個只有一個查詢的交易。 我可能會每隔一小時左右運行一次查詢,使用Pentaho ETL腳本,而只是用BIRT查詢連接表。 –

+0

您可以使用第三個表格而不是臨時表格。只需截斷並在需要時重建。你甚至可以只建立新的記錄,小時工的速度會更快。使它成爲一個存儲過程,在查詢第三個表之前,您的代碼執行它。沒有什麼花哨。我會擔心它是否能及時給出正確的結果。 – Tim3880