让我先谈谈我仍然是php / mysql的新手。
我正在尝试构建一个系统,可用于记录为客户完成的工作,跟踪工作号,客户名称,设备,日期和分配给该任务的员工。
我有一个表设置来处理员工的分配,但我似乎无法弄清楚如何按照我想要的方式格式化结果。
可能会有多名员工在几天内被分配到同一个工作。所以我设置了一个表格:
job_ID | employee_name | date_worked | hours_worked
1 | Dave | 2010-1-2 | 4.5
1 | Dave | 2010-1-3 | 4.0
1 | Mike | 2010-1-2 | 6.0
2 | Bill | 2011-5-7 | 8.0
2 | Bill | 2011-5-8 | 6.5
2 | Dave | 2011-5-7 | 4.0
2 | Dave | 2011-5-8 | 4.5
我想要对结果做什么输出就像:
Job # = 1
Employee | 2010-1-2 | 2010-1-3 |
Dave | 4.5 | 4.0 |
Mike | 6.0 | 0 |
Job # = 2
Employee | 2011-5-7 | 2011-5-8 |
Bill | 8.0 | 6.5 |
Dave | 4.0 | 4.5 |
有人可以提供建议吗?
修改的
好的,我想我遗漏了一些信息。
我有一个用于保存记录的表(job_list)。
此表记录了job_id,客户端,设备,位置,通话日期,响应日期,完成日期等。
然后我有一个表(employee_list),按ID和名称列出所有员工。
我之前发布的表格背后的想法是只记录谁在哪里,在哪一天,以及多长时间。
我修改了我发布的表有employee_id。
我想在php中显示结果,看起来像我发布的输出。我只是不知道该怎么做。
我可以提供哪些其他信息?我对我需要发布的内容缺乏了解表示歉意: - /
如果我的方法完全可怕,我确实说我还是新手......
答案 0 :(得分:1)
这基本上是PIVOT
但是MySQL没有PIVOT
函数,所以你需要使用聚合函数和CASE
语句来复制它。如果您知道要转换查询的所有值,则类似于:
select employee_name,
sum(case when date_worked = '2010-01-02' then hours_worked else 0 end) `2010-01-02`,
sum(case when date_worked = '2010-01-03' then hours_worked else 0 end) `2010-01-03`
from yourtable
group by employee_name
结果是:
| EMPLOYEE_NAME | 2010-01-02 | 2010-01-03 |
-------------------------------------------
| Bill | 0 | 0 |
| Dave | 4.5 | 4 |
| Mike | 6 | 0 |
如果您有一个未知数量的值,那么您可以使用预准备语句动态生成它:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when date_worked = ''',
date_worked,
''' then hours_worked else 0 end) AS `',
date_worked, '`'
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT employee_name, ', @sql, '
FROM yourtable
GROUP BY employee_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
两者都会产生相同的结果。