2013-07-08 48 views
0

我有如下幾種字段的表列:分割使用其他列作爲參考

Tr_Date Tr_Time Tr_Data 
20130313 43359 41239 
20130313 45317 46594 
20130313 45920 62223 
20130313 51227 51826 
20130313 51312 51808 
20130313 52131 47516 
20130313 52443 61269 
20130313 52447 63318 
20130313 52453 2709 
20130313 52545 61262 
20130313 52623 21206 
20130313 52655 48123 
20130313 53250 29004 
20130313 53440 55534 
20130313 53503 30380 
20130313 53932 46166 
20130313 54157 2653 
20130313 54325 46262 
20130313 54503 2055 
20130313 54548 18078 
20130313 54557 21660 
20130313 54623 54390 
20130313 54656 46550 
20130313 54700 59238 

我需要做的是Tr_Time分成兩列。基礎將是Tr_DateTr_Data。在每個Tr_DateTr_Data,有2 Tr_Time我必須分成兩個不同的列。這實際上是一個從timein/out系統中的id掃描中捕獲的數據庫。但是,內外都保存在一列中。我必須在SQL中進行分離。爲了操作工資系統中的計時數據。

任何幫助將非常感激。

預先感謝您。

+0

你可以顯示示例輸出嗎? – revoua

+1

如果IN和OUT時間保存在一列中,那麼IN由OUT時間替代? – rajeemcariazo

+0

您顯示的示例數據不是非常有用。 'Tr-Date'值完全相同,我沒有真正能夠理解其他兩列中的數據。 如果你理解數據,不會用where子句做簡單的選擇嗎? – Nanda

回答

0

我不知道SQL服務器的語法非常好,但我認爲你應該使用GroupBy功能和MIN/MAX功能(或First,取決於字段類型),像這樣:

INSERT INTO destTable SELECT 
    Tr_Date, 
    MIN(Tr_Time) as inField, 
    MAX(Tr_Time) as OutField, 
    Tr_Data 
FROM table 
GROUP BY 
    Tr_Date, 
    Tr_Data; 

如果字段是不是你可以使用類似的整數:

INSERT INTO destTable SELECT 
    Tr_Date, 
    FIRST(Tr_Time) as inField, 
    FIRST(Tr_Time) as OutField, 
    Tr_Data 
FROM table 
GROUP BY 
    Tr_Date, 
    Tr_Data; 

並在此之後,你應該更新你的表像這樣:

UPDATE destTable AS a 
    SET OutField = 
     (SELECT Tr_Time 
     FROM table as b 
     WHERE a.Tr_Date = b.Tr_Date 
      AND a.Tr_Data = bg.Tr_Data 
      AND b.Tr_Time <> a.OutField) 

也許你應該有destTable表已經定義(我不知道),也許你應該用正確的語法重新排列查詢,但我認爲這個概念可以幫助。

0

如果你只有兩行各Tr_DateTr_Data組合(第一,OUT秒),查詢可以是這樣的:

WITH CTE AS 
(
    SELECT 
    *, ROW_NUMBER() OVER (PARTITION BY Tr_Date,Tr_Data ORDER BY Tr_Time) RN 
    FROM Table1 
) 
SELECT 
    c_in.Tr_Date 
,c_in.Tr_Data 
,c_in.Tr_Time AS Time_In 
,c_out.Tr_Time AS Time_Out 
FROM CTE c_in 
LEFT JOIN CTE c_out 
    ON c_in.Tr_Date = c_out.Tr_Date 
    AND c_in.Tr_Data = c_out.Tr_Data 
    AND c_in.RN = 1 
    AND c_out.RN = 2 
WHERE c_in.RN = 1 

SQLFiddle DEMO (你的樣本數據缺乏任何超出行,所以我用隨機數增加了一些額外的行)

+1

爲什麼不乾脆'選擇 Tr_Date,MIN(Tr_Time),MAX(Tr_Time),Tr_Data FROM表1 組由Tr_Date,Tr_Data '如果他只想選擇? –

+0

@trippino好點,我傾向於忽略簡單的解決方案:) ...但是,如果time_out行還不存在,我猜NULL應該返回,而不是與time_in相同的時間 –

0

試試這個

SELECT Tr_Date , 
     Tr_Data , 
     MAX(Tr_Time) , 
     MIN(Tr_Time) 
FROM TableName 
GROUP BY Tr_Date , 
     Tr_Data