Mysql查询数据转换

时间:2013-06-22 00:08:08

标签: 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 个答案:

答案 0 :(得分:2)

下面采用的方法是为每个季度创建一个驱动程序表,其中包含有关年份和季度的信息。然后使用非等值连接将其加入employee表。在季度或季度之前开始并在季度结束后开始的员工在季度末活跃。

它使用一个技巧进行日期比较,即将年度季度组合转换为四分之一计数,将年份乘以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

答案 1 :(得分:0)

试试这个

SELECT QUARTER('2008-04-01');

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_quarter

和CONCAT()