2009-10-12 108 views
0

表1如何獲得日期時間?

ID Date Time Functionkey 

001 23-02-2009, 08:00:00 A 
001 23-02-2009, 12:00:00 A 
001 23-02-2009, 13:00:00 B 
001 23-02-2009, 14:00:00 B 
001 23-02-2009, 16:00:00 C 
001 23-02-2009, 17:00:00 C 
001 23-02-2009, 19:00:00 D 
001 23-02-2009, 21:00:00 D 
001 24-02-2009 10:00:00 A 
001 24-02-2009 18:00:00 D 
001 25-02-2009 09:00:00 A 
001 25-02-2009 12:00:00 B 
001 25-02-2009 18:00:00 D 
...., 

我想獲得分鐘(時間),其中功能鍵= 'A',MAX(時間)其中功能鍵= 'B',分鐘(時間),其中功能鍵= 'C'。 MAX(次),其中功能鍵= 'd' 查詢:

SELECT 
     ID, Date, 
     CASE WHEN function = 'A' THEN min(time) END as Intime1, 
     CASE WHEN function = 'B' THEN max(time) END as Outtime1, 
     CASE WHEN function = 'C' THEN min(time) END as Intime2, 
     CASE WHEN function = 'D' THEN max(time) END as Outtime2 
    FROM dbo.table1 
    GROUP BY id, date, function 

獲得輸出

ID Date, Intime1, Outtime1, Intime2, Outtime2 

001 23-02-2009 08:00:00, null, null, null 
001 23-02-2009 null, 14:00:00, null, null 
001 23-02-2009 null, null, 16:00:00, null 
001 23-02-2009 null, null, null, 21:00:00 

...,

我需要一條線,如何使一個查詢輸出

ID Date, Intime1, Outtime1, Intime2, Outtime2 

001 23-02-2009 08:00:00, 14:00:00. 16:00:00, 21:00:00 
001 24-02-2009 09:00:00 null, null, 18:00:00 
001 25-02-2009 09:00:00, 12:00:00, null, 18:00:00 

...,

如何修改我的查詢?

+0

任何一個可以幫助解決這個問題 – Gopal 2009-10-12 12:46:48

+0

檢查新的編輯我的答案 – rslite 2009-10-12 13:55:15

回答

2

試着這麼做:

SELECT T1.ID, T1.Date, MIN(T1.Time) As Intime, MAX(T2.Time) AS Outtime 
FROM Table1 T1 
JOIN Table1 T2 ON T1.ID=T2.ID AND T1.Date=T2.Date 
WHERE T1.Function = 'A' AND T2.Function='D' 
GROUP BY T1.ID, T1.Date 

編輯:關於你的評論,你只需要與功能改變爲表T1的條件的最低(參見上面的MIN(T1.Time))和表T2的條件(最大值見上面的MAX(T2.Time)),所以它應該是:

SELECT T1.ID, T1.Date, MIN(T1.Time) As Intime, MAX(T2.Time) AS Outtime 
FROM Table1 T1 
JOIN Table1 T2 ON T1.ID=T2.ID AND T1.Date=T2.Date 
WHERE T1.Function = 'C' AND T2.Function='D' 
GROUP BY T1.ID, T1.Date 

我希望我能從評論中正確理解你需要什麼。

編輯2:好的,我現在明白了。你需要做同樣的自聯接兩次這樣的:

SELECT 
    T1.ID, T1.Date, 
    MIN(T1.Time) AS Intime1, 
    MAX(T2.Time) AS Outtime1, 
    MIN(T3.Time) AS Intime2, 
    MAX(T4.Time) AS Outtime2 
FROM Table1 T1 
JOIN Table1 T2 
    ON T1.ID=T2.ID AND T1.Date=T2.Date 
JOIN Table1 T3 
    ON T1.ID=T3.ID AND T1.Date=T3.Date 
JOIN Table1 T4 
    ON T1.ID=T4.ID AND T1.Date=T4.Date 
WHERE 
    T1.Func = 'A' 
    AND T2.Func='B' 
    AND T3.Func='C' 
    AND T4.Func='D' 
GROUP BY 
    T1.ID, T1.Date 

編輯3:爲了考慮可能的遺漏值嘗試下查詢。唯一需要存在的值是函數'A'。其餘的都可以缺席:

SELECT 
    T1.ID, T1.Date, 
    MIN(T1.Time) AS Intime1, 
    MAX(T2.Time) AS Outtime1, 
    MIN(T3.Time) AS Intime2, 
    MAX(T4.Time) AS Outtime2 
FROM Table1 T1 
LEFT JOIN Table1 T2 
    ON T1.ID=T2.ID AND T1.Date=T2.Date AND T2.Func = 'B' 
LEFT JOIN Table1 T3 
    ON T1.ID=T3.ID AND T1.Date=T3.Date AND T3.Func = 'C' 
LEFT JOIN Table1 T4 
    ON T1.ID=T4.ID AND T1.Date=T4.Date AND T4.Func = 'D' 
WHERE 
    T1.Func = 'A' 
GROUP BY 
    T1.ID, T1.Date 
+0

工作,假設我有功能鍵b和c也在這裏,我想在功能鍵= c時使用min(時間),在同一個表上使用功能鍵= d時使用max(time)。如何查詢 – Gopal 2009-10-12 09:27:14

+0

否假設我想採取所有功能鍵的方法 - 最小(時間)其中函數='A',最大(時間)其中函數='b',min(時間)其中函數='c' ,max(time)where function ='d'在同一天。如何修改查詢 – Gopal 2009-10-12 10:02:58

+0

我修改我的問題,你可以檢查請。 – Gopal 2009-10-12 10:12:14

0

你真的應該考慮的一件事是將你的日期/時間存儲爲一個格式爲unix時間戳的單列,這使得處理日期/時間變得更容易。

+0

我的時間列僅日期時間。 – Gopal 2009-10-12 07:53:07

0

嘗試以下操作:

SELECT ID, 
     Date, 
     min(time) AS Intime, 
     max(time) AS Outtime 
FROM table1 
GROUP BY id, date 
+0

我需要最小值(時間)當函數= a和最大值(時間)當函數= d好的時候,我不問你上面的發佈結果。 – Gopal 2009-10-12 07:53:38

相關問題