MySQL: несколько SELECT с разными WHERE на одном поле с результатом в отдельных столбцах

0

Я прочитал множество вопросов, касающихся похожих сценариев, но не могу найти решения.

У меня есть следующий запрос, чтобы получить накопленные timetrackings (остановка и запуск - отметки времени UNIX) на пользователя за календарную неделю, разделенные типом тайм-трека (время проекта, время вождения и т.д.).

SELECT 
u.login as Person,
DATE_FORMAT(FROM_UNIXTIME(t.start), '%x-%v') as CalendarWeek,
t.tracking_type as TrackingType,
REPLACE(ROUND(SUM(stop-start) / 60 / 60, 2), '.', ',') AS TimeHrs
FROM ps_time_tracking t
LEFT OUTER JOIN users u ON (u.id = t.user_id)
GROUP BY Person, CalendarWeek, TrackingType
ORDER BY CalendarWeek ASC, Person ASC

Результат выглядит следующим образом:

| Person | CalendarWeek | TrackingType | TimeHrs | 
| ------------------------------------------------
| User A | 2018-01      | project time | 31,82   | 
| User A | 2018-01      | driving time | 4,75    | 
| User B | 2018-01      | project time | 60,17   | 
| User B | 2018-01      | driving time | 9,02    | 
| User C | 2018-01      | project time | 7,33    |

Целью было бы положить результат нескольких ГДЕ, таких как

WHERE t.tracking_type = 'project time'
WHERE t.tracking_type = 'driving time'

в разных столбцах результата:

| Person | CalendarWeek | TrackingType | ProjectTime | DrivingTime |
| --------------------------------------------------------------------
| User A | 2018-01      | project time | 31,82       | 4,75        |
| User B | 2018-01      | project time | 60,17       | 9,02        |
| User C | 2018-01      | project time | 7,33        | (null)      |

Любая помощь будет оценена по достоинству.

  • 0
    Вы можете использовать оператор CASE .
Теги:

1 ответ

0
Лучший ответ

Вы можете использовать CASE чтобы получить то, что вам нужно. Это будет выглядеть примерно так:

SELECT 
u.login as Person,
DATE_FORMAT(FROM_UNIXTIME(t.start), '%x-%v') as CalendarWeek,
REPLACE(ROUND(SUM(CASE WHEN TrackingType = 'project time' THEN stop-start ELSE 0 END) / 60 / 60, 2), '.', ',') AS ProjectTime,
REPLACE(ROUND(SUM(CASE WHEN TrackingType = 'driving time' THEN stop-start ELSE 0 END) / 60 / 60, 2), '.', ',') AS DrivingTime
FROM ps_time_tracking t
LEFT OUTER JOIN users u ON (u.id = t.user_id)
GROUP BY Person, CalendarWeek
ORDER BY CalendarWeek ASC, Person ASC
  • 0
    Огромное спасибо - теперь работает отлично!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню