2017-02-27 72 views
0
 Date    Time  Mode ID 
    2017-01-01 13:00:00.0000000 3 10 
    2017-01-01 14:00:00.0000000 1 10 
    2017-01-01 15:00:00.0000000 3 10 
    2017-01-01 15:30:00.0000000 1 10 

這是一個臨時表。我只想將時間列顯示爲2列,1列與mode = 3,其他與mode = 1。如何在SQL中轉儲臨時表

這是一個臨時table.I只想以下輸出:

  Date   InTime(Mode-3) OutTime(Mode-1)  ID 

     2017-01-01 13:00:00.0000000 14:00:00.0000000 10 

     2017-01-01 15:00:00.0000000 15:30:00.0000000 10 
+2

你應該提供你正在尋找的結果和你已經嘗試任何企圖。 –

+0

請閱讀[如何問一個好的SQL問題](http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056)和[如何創建一個MCVE](http://stackoverflow.com/help/mcve) – Shnugo

回答

0

這個方法奏效,取決於數據和數據類型/模式(如果表的名稱是時間表):

SELECT DATE, time AS 'InTime(Mode-3)', 
     (SELECT TOP 1 time FROM timeTable 
      WHERE mode = 1 
      AND id = outerTable.id 
      AND date = outerTable.date 
      AND time > outerTable.time 
      ORDER BY date, time) AS 'OutTime(Mode-1)', 
     ID 
    FROM timeTable AS outerTable 
    WHERE mode = 3 
  • 的outerQuery只選擇在倍模式= 3
  • 在innerQuery選擇下一個出時間,即correspondes到在時間選擇,並且僅返回第一。由於按日期和時間排序,它應該是下一個。 只有你給出的數據
測試

輸出:

Date  | InTime(Mode-3)  | OutTime(Mode-1) | ID 
---------------|---------------------|---------------------|------ 
    2017-01-01 | 13:00:00.0000000 | 14:00:00.0000000 | 10 
    2017-01-01 | 15:00:00.0000000 | 15:30:00.0000000 | 10 

僅供參考:
我用這個表模式

CREATE TABLE timeTable(
    date DATE, 
    time TIME, 
    mode INTEGER, 
    id INTEGER 
); 

更新:
隨着時間的推移 - 差:

SELECT *, DATEDIFF(MINUTE,INTIME,OUTTIME) AS [DIFFERENCE] FROM (
    SELECT [DATE], [time] AS INTIME, 
     (SELECT TOP 1 [time] FROM timeTable 
      WHERE [mode] = 1 
      AND [id] = outerTable.id 
      AND [date] = outerTable.date 
      AND [time] > outerTable.time 
      ORDER BY [date], [time]) AS OUTTIME, 
     [ID] 
    FROM [timeTable] AS outerTable 
    WHERE [mode] = 3 
) WholeData 
+0

偉大的,工作......謝謝 – michael

+0

還需要在另一列獲得時差-winner_joiner – michael

+0

@michael'DATEDIFF(MINUTE,column1,column2)'這工作 –

1

猜測要一個方法來創建具有固定值的交替的行(1和3)。 可以使用

的情況下,當ROW_NUMBER()OVER(ORDER BY [日期])%2 = 0,則1,否則3

作爲邏輯爲您的模式列

+0

這是一個臨時表。我只想將時間列顯示爲2列,1列的模式= 3,其他模式= 1 – michael

1

嘗試此,

DECLARE @TB TABLE (DATETIME VARCHAR(30),ID INT) 
INSERT INTO @TB VALUES 
('2017-01-01 13:00:00.0000000',10), 
('2017-01-01 14:00:00.0000000',10), 
('2017-01-01 15:00:00.0000000',10), 
('2017-01-01 15:30:00.0000000',10) 

SELECT SUBSTRING(DATETIME,0,11) DATE 
     ,SUBSTRING(DATETIME,12,LEN(DATETIME)) TIME 
     ,CASE WHEN ROW_NUMBER() OVER (ORDER BY DATETIME)%2 = 0 THEN 1 ELSE 3 END MODE 
     ,ID 
FROM @TB