2016-07-18 5 views
2

Привет, У меня есть таблица, подобная этой, которая содержит сдвиг для людей в этот день. Мне нужно, чтобы быть классифицированы по сменамкак выбрать верхние 3 значения каждого столбца в mysql

+------------+----------+-----------------+ 
| shift_date | name  | shift   | 
+------------+----------+-----------------+ 
| 2016-07-01 | Swamy | Morning Shift | 
| 2016-07-01 | Hitesh | Morning Shift | 
| 2016-07-01 | Naresh | Afternoon Shift | 
| 2016-07-01 | Rambabu | Afternoon Shift | 
| 2016-07-01 | Srinivas | Night Shift  | 
| 2016-07-01 | Ahmed | Night Shift  | 
| 2016-07-01 | Naveen | Week Off  | 
| 2016-07-01 | Karthik | Week Off  | 
+------------+----------+-----------------+ 

и мне нужен запрос, чтобы получить результат как

+------------+---------+-----------+----------+---------+ 
| shift_date | Morning | Afternoon | Night | WeekOff | 
+------------+---------+-----------+----------+---------+ 
| 2016-07-01 | Swamy | Naresh | Srinivas | Naveen | 
| 2016-07-01 | Hitesh | Rambabu | Ahmed | Karthik | 
+------------+---------+-----------+----------+---------+ 

Я написал этот запрос,

select 
    shift_date, 
    CASE shift 
     WHEN shift <>'Morning Shift' 
     then name 
    end as Morning, 
    CASE shift 
     WHEN shift<>'Afternoon Shift' 
     then name 
    end as Afternoon, 
    CASE shift 
     WHEN shift<>'Night Shift' 
     then name 
    end as Night, 
    CASE shift 
     WHEN shift<>'Week Off' 
     then name 
    end as WeekOff 
from roster 
where shift_date ='2016-7-1' 
order by morning desc ,afternoon desc, night desc ,weekoff desc; 

но его получение результата, как

+------------+---------+-----------+----------+---------+ 
| shift_date | Morning | Afternoon | Night | WeekOff | 
+------------+---------+-----------+----------+---------+ 
| 2016-07-01 | Swamy | NULL  | NULL  | NULL | 
| 2016-07-01 | Hitesh | NULL  | NULL  | NULL | 
| 2016-07-01 | NULL | Rambabu | NULL  | NULL | 
| 2016-07-01 | NULL | Naresh | NULL  | NULL | 
| 2016-07-01 | NULL | NULL  | Srinivas | NULL | 
| 2016-07-01 | NULL | NULL  | Ahmed | NULL | 
| 2016-07-01 | NULL | NULL  | NULL  | Naveen | 
| 2016-07-01 | NULL | NULL  | NULL  | Karthik | 
+------------+---------+-----------+----------+---------+ 

и мне нужно результат в

+------------+---------+-----------+----------+---------+ 
| shift_date | Morning | Afternoon | Night | WeekOff | 
+------------+---------+-----------+----------+---------+ 
| 2016-07-01 | Swamy | Naresh | Srinivas | Naveen | 
| 2016-07-01 | Hitesh | Rambabu | Ahmed | Karthik | 
+------------+---------+-----------+----------+---------+ 
+1

Ваш желаемый результат не будет иметь гибкой логики. Я предлагаю вам реализовать это на своем серверном языке. – KaeL

+0

'MAX (CASE WHEN ...) ... GROUP BY shiftdate' (хотя я не понимаю' <> 'бит!?!? – Strawberry

+0

Я пробовал MAX, но возвращал только один столбец, а <> - это ничего, кроме не равный – Ahmed

ответ

0
select m.shift_date ,Morning , Afternoon 
from (select shift_date,name as Morning from roster where shift = 'Morning Shift') as m, 
LEFT JOIN (select shift_date,name as Afternoon from roster where shift = 'Afternoon Shift') as n on m.shift_date = n.shift_date 

В вашем вопросе у тебя было все даты сдвига, как же. Таким образом, с этим соединением на дату будет также получено имя для shift_date.

Это не подходящее решение. Надеюсь, что это может помочь

0
SELECT shift_date 
    , MAX(CASE WHEN shift = 'morning shift' THEN name END) `morning` 
    , MAX(CASE WHEN shift = 'afternoon shift' THEN name END) `afternoon` 
    , MAX(CASE WHEN shift = 'night shift' THEN name END) `night` 
    , MAX(CASE WHEN shift = 'week off' THEN name END) `week off` 
    FROM 
    (SELECT x.* 
      , COUNT(*) rank 
     FROM my_table x 
     JOIN my_table y 
      ON y.shift_date = x.shift_date 
      AND y.shift = x.shift 
      AND y.name <= x.name 
     GROUP 
      BY x.shift_date 
      , x.shift 
      , x.name 
    ) n 
GROUP 
    BY shift_date,rank;