2013-09-10 3 views
2

я следующую таблицу и данныеповорачиваетс помочь мне, чтобы получить этот результат

Таблица DutyRoaster:

╔═══════════════╦═════════════════════════╦═════════╦════════════╗ 
║ DutyRecordId ║  DutyDate   ║ ShiftNo ║ EmployeeId ║ 
╠═══════════════╬═════════════════════════╬═════════╬════════════╣ 
║    1 ║ 2013-09-10 00:00:00.000 ║  1 ║   2 ║ 
║    2 ║ 2013-09-10 00:00:00.000 ║  1 ║   10 ║ 
║    3 ║ 2013-09-10 00:00:00.000 ║  2 ║   7 ║ 
║    4 ║ 2013-09-10 00:00:00.000 ║  2 ║   9 ║ 
║    5 ║ 2013-09-10 00:00:00.000 ║  2 ║   4 ║ 
║    6 ║ 2013-09-10 00:00:00.000 ║  3 ║   12 ║ 
║    7 ║ 2013-09-10 00:00:00.000 ║  3 ║   5 ║ 
║    8 ║ 2013-09-10 00:00:00.000 ║  4 ║   3 ║ 
║    9 ║ 2013-09-10 00:00:00.000 ║  4 ║   1 ║ 
║   10 ║ 2013-09-10 00:00:00.000 ║  4 ║   13 ║ 
╚═══════════════╩═════════════════════════╩═════════╩════════════╝ 

У меня есть еще одна таблица, имеющий emplyeedId и Name
Я хочу результат:

╔══════════════════════════════════════════════════════╗ 
║ Date  Shiftno1 Shiftno 2 Sitno 3 Shiftno4 ║ 
╠══════════════════════════════════════════════════════╣ 
║              ║ 
║  10-02-1203 Jhon  peter  Micheal Jim ║ 
║     Smith  Molly  Henry Kim ║ 
║       Adam     Nick ║ 
║            Kaity ║ 
╚══════════════════════════════════════════════════════╝ 

Возможно ли получить это с помощью Pivot?

+3

Что RDBMS вы используете ?? –

+1

Что вы используете (SQL Server, MySQL, Oracle, Postres, ...)? То, о чем вы спрашиваете, ** очень специфично для поставщиков **. – peterm

+0

Откуда взялась эта дата? (Я предполагаю, что это 2013 год, но нет никакой ссылки из вашего исходного набора данных об этой дате) –

ответ

0

Для SQL Server (или PostgreSQL), вы можете сделать это:

with cte as (
    select 
     d.DutyDate, 
     d.ShiftNo, 
     e.Name, 
     row_number() over(partition by d.ShiftNo order by d.DutyRecordId) as rn 
    from DutyRoaster as d 
     inner join Employees as e on e.Id = d.EmployeeId 
) 
select 
    case when c.rn = 1 then c.DutyDate end as DutyDate, 
    min(case when c.ShiftNo = 1 then c.Name end) as ShiftNo1, 
    min(case when c.ShiftNo = 2 then c.Name end) as ShiftNo2, 
    min(case when c.ShiftNo = 3 then c.Name end) as ShiftNo3, 
    min(case when c.ShiftNo = 4 then c.Name end) as ShiftNo4 
from cte as c 
group by c.DutyDate, c.rn 
order by c.DutyDate, c.rn 

sql fiddle demo

0

Если это MySql вы можете использовать динамический SQL. Успение (из вашего опубликованного желаемого результата) состоит в том, что вам нужна строка за дачу.

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT CONCAT('GROUP_CONCAT(CASE WHEN shiftno = ', shiftno, 
          ' THEN e.name END) `shift', shiftno, '`')) 
    INTO @sql 
    FROM DutyRoaster; 

SET @sql = CONCAT('SELECT DATE(DutyDate),', @sql, 
        ' FROM DutyRoaster r JOIN employees e 
         ON r.employeeId = e.employeeId 
        GROUP BY DATE(DutyDate)'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Выход:

 
+------------+------------+------------------+---------------+--------------+ 
| date  | shift1  | shift2   | shift3  | shift4  | 
+------------+------------+------------------+---------------+--------------+ 
| 2013-09-10 | Jhon,Smith | Peter,Molly,Adam | Micheal,Henry | Jim,Kim,Nick | 
+------------+------------+------------------+---------------+--------------+ 

Здесь SQLFiddle демо

Смежные вопросы