Как получить время на свидания? - PullRequest
0 голосов
/ 12 октября 2009

Table1

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
....,

Я хочу получить min (время), где функциональная клавиша = 'A', max (время), где функциональная клавиша = 'B', min (время), где функциональная клавиша = '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

...

Как изменить мой запрос?

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Попробуйте что-то вроде:

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 голосов
/ 12 октября 2009

Попробуйте следующее:

SELECT  ID, 
        Date, 
        min(time) AS Intime, 
        max(time) AS Outtime 
FROM table1 
GROUP BY id, date
0 голосов
/ 12 октября 2009

Одна вещь, которую вы действительно должны учитывать, - это сохранять дату / время в виде одного столбца, отформатированного как метка времени Unix, это значительно упрощает обработку даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...