选择一周的5个日期
问题描述:
我有这张桌子,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
任何帮助或线索中的数据?
在此先感谢
答
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:
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;
两者都给出结果:
| 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 |
答
你可以在MySQL中使用聚集做支点:
select proyect_id,
sum(case when date = '01/01/2013' then hours end) as "01/01/2013",
. . .
from t
group by proyect_id
的. . .
手段等为列的其余部分。
yap!抱歉,但想法是在2个日期之间获取这些数据,例如2013年1月1日至2013年1月15日。我必须建立这个输出,给出2个日期,即初始和最终数据。 – 2013-02-26 14:39:37
在这种情况下,您必须将该语句构建为一个字符串,然后执行它。 SQL查询具有固定数量的列。 – 2013-02-26 14:41:11