2013-02-26 147 views
1

我有这张桌子,Lineas(id,日期,proyect_id,小时),我想选择一个星期的时间总和为一个星期。例如,我需要这个输出日期2013年1月1日和2013/05/01之间:选择一周的5个日期

Proyect | 01/01/2013 | 02/01/2013 | 03/01/2013 | 04/01/2013 | 05/01/2013 
Proyect1 |  -  |  5  |  -  |  4  |  4 
Proyect2 |  4  |  2  |  8  |  4  |  2 
Proyect3 |  4  |  1  |  -  |  -  |  2 

这是表

Id | Proyect_id | date | hours 
    1 | Proyect1  | 02/01/2013 | 5 
    2 | Proyect1  | 04/01/2013 | 4 
    3 | Proyect1  | 05/01/2013 | 4 
    4 | Proyect2  | 01/01/2013 | 4 
    5 | Proyect2  | 02/01/2013 | 2 
    6 | Proyect2  | 03/01/2013 | 8 
    7 | Proyect2  | 04/01/2013 | 4 
    8 | Proyect2  | 05/01/2013 | 2 
    9 | Proyect3  | 01/01/2013 | 4 
    10 | Proyect3  | 02/01/2013 | 1 
    11 | Proyect3  | 05/01/2013 | 2 

任何帮助或线索中的数据?

在此先感谢

回答

4

MySQL没有支点函数,因此您需要使用具有CASE表达式的集合函数来复制该功能。

如果你的价值观是已知的,那么你可以硬编码它们与此类似:

select Proyect_id, 
    sum(case when date = '2013-01-01' then hours end) `2013-01-01`, 
    sum(case when date = '2013-02-01' then hours end) `2013-02-01`, 
    sum(case when date = '2013-03-01' then hours end) `2013-03-01`, 
    sum(case when date = '2013-04-01' then hours end) `2013-04-01` 
from Lineas 
group by Proyect_id 

SQL Fiddle with Demo

但是,如果值是未知的,那么你将要使用准备语句生成动态SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when date = ''', 
     date, 
     ''' then hours else 0 end) AS `', 
     date, '`' 
    ) 
) INTO @sql 
FROM Lineas; 

SET @sql = CONCAT('SELECT Proyect_id, ', @sql, ' 
        FROM Lineas 
        GROUP BY Proyect_id'); 

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

SQL Fiddle with Demo

两者都给出结果:

| PROYECT_ID | 2013-01-01 | 2013-02-01 | 2013-03-01 | 2013-04-01 | 
------------------------------------------------------------------ 
| Proyect1 |   0 |   5 |   0 |   4 | 
| Proyect2 |   4 |   2 |   8 |   4 | 
| Proyect3 |   4 |   1 |   0 |   0 | 
2

你可以在MySQL中使用聚集做支点:

select proyect_id, 
     sum(case when date = '01/01/2013' then hours end) as "01/01/2013", 
     . . . 
from t 
group by proyect_id 

. . .手段等为列的其余部分。

+0

yap!抱歉,但想法是在2个日期之间获取这些数据,例如2013年1月1日至2013年1月15日。我必须建立这个输出,给出2个日期,即初始和最终数据。 – 2013-02-26 14:39:37

+0

在这种情况下,您必须将该语句构建为一个字符串,然后执行它。 SQL查询具有固定数量的列。 – 2013-02-26 14:41:11

相关问题