2013-06-22 2 views
2

Я пытаюсь сделать преобразование на таблице в Mysql. Я не могу понять, как это сделать. Может ли кто-нибудь сказать мне, как это сделать? Ввод и вывод заданы. Я хотел бы знать, как это делается?Преобразование данных запроса Mysql

Входной стол

+-------------+------------+------------------+-------------------+ 
| Employee_ID | Start_Date | Termination_Date | Performance_Level | 
+-------------+------------+------------------+-------------------+ 
|   1 | 1/1/2007 | 3/1/2007   | Low    | 
|   2 | 6/5/2004 | Null    | Medium   | 
|   3 | 4/3/2003 | Null    | High    | 
|   4 | 9/1/2002 | 4/15/2007  | Medium   | 
|   5 | 4/6/2007 | 11/1/2007  | Low    | 
|   6 | 7/1/2007 | Null    | High    | 
|   7 | 3/2/2005 | 8/1/2007   | Low    | 
+-------------+------------+------------------+-------------------+ 

Ouput Таблица

+---------+-----------------------------------+-----------------+-------------------+----------------+ 
| Period | Total_Employees_at_end_of_quarter | High_Performers | Medium_Performers | Low_Performers | 
+---------+-----------------------------------+-----------------+-------------------+----------------+ 
| Q1-2007 |         4 |    1 |     2 |    1 | 
| Q2-2007 |         4 |    1 |     1 |    2 | 
| Q3-2007 |         4 |    2 |     1 |    1 | 
| Q4-2007 |         3 |    2 |     1 |    0 | 
+---------+-----------------------------------+-----------------+-------------------+----------------+ 

Это то, что я пытался

select * from emp 
where date(sdate)< date'2007-04-01' and (date(tdate)> date'2007-03-31' or tdate is null); 

select * from emp 
where date(sdate)< date'2007-07-01' and (date(tdate)> date'2007-06-30' or tdate is null); 

select * from emp 
where date(sdate)< date'2007-010-01' and (date(tdate)> date'2007-09-30' or tdate is null); 

select * from emp 
where date(sdate)< date'2008-01-01' and (date(tdate)> date'2007-12-31' or tdate is null); 

У меня есть отдельные вопросы, но я хочу один запрос, который будет давать выходы ,

ответ

2

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

Он использует один трюк для сопоставления даты, который должен преобразовывать комбинацию года в квартал, умножая год на 4 и добавляя квартал. Это удобство для упрощения сопоставлений дат.

select driver.qtryr, count(*) as TotalPerformers, 
     sum(Performance_level = 'High') as HighPerformers, 
     sum(Performance_level = 'Medium') as MediumPerformers, 
     sum(Performance_level = 'Low') as LowPerformers 
from (select 2007 as yr, 1 as qtr, 'Q1-2007' as qtryr union all 
     select 2007 as yr, 2 as qtr, 'Q2-2007' as qtryr union all 
     select 2007 as yr, 3 as qtr, 'Q3-2007' as qtryr union all 
     select 2007 as yr, 4 as qtr, 'Q4-2007' as qtryr 
    ) driver left outer join 
    Table1 emp 
    on year(emp.start_date)*4+quarter(emp.start_date) <= driver.yr*4+qtr and 
     (emp.termination_date is null or 
     year(emp.termination_date)*4+quarter(emp.termination_date) > driver.yr*4+qtr 
     ) 
group by driver.qtryr 
+0

Спасибо. Это необходимое мне решение, и я также узнал о таблицах драйверов. – navin