2013-06-22 83 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    | 
+-------------+------------+------------------+-------------------+ 

输出继电器表

+---------+-----------------------------------+-----------------+-------------------+----------------+ 
| 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

下面采取的方法是创建一个驱动器表中的每个季度,以及有关年度和季度信息。然后使用非Equijoin加入员工表。在季度之前或季度之前开始并在季度之后结束的员工在季度末活跃。

它使用一种技巧进行日期比较,即将年度季度组合转换为季度总数,方法是将年份乘以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