0

让我从我对 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 和 name 列出所有员工。

我之前发布的表格背后的想法是成为一张只记录谁在哪里、在哪一天以及持续了多长时间的表格。

我已将我发布的表格修改为具有employee_id。

我想在 php 中显示结果,看起来像我发布的输出。我只是不知道该怎么做。

我还能提供哪些其他信息?抱歉我对我需要发布的内容缺乏了解:-/

如果我的方法非常糟糕,我确实说过我对此还是新手......

4

1 回答 1

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

请参阅带有演示的 SQL Fiddle

结果是:

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

请参阅带有演示的 SQL Fiddle

两者都会产生相同的结果。

于 2012-11-15T21:22:41.983 回答