使用date vaule的mysql pivot帮助

时间:2017-04-05 18:08:29

标签: mysql pivot

我开始使用sql并且已经遇到了问题。 我可以使用我需要的数据创建临时表,显示用户在给定日期范围内工作的小时数...日期会有所不同 我明白了......

User hours worked_date
Bill  8     01-04-17
Bill  6     02-04-17
Bob   7     01-04-17

但是我需要这样做......

User  01-04-17  02-04-17
Bill    8         6
bob     7      

我可以毫无问题地在ms访问中执行此操作,但我无法在mysql中使用它...并且帮助指南让我迷失方向。非常感谢任何帮助。

由于 LEA

1 个答案:

答案 0 :(得分:0)

不幸的是,它与MySQL中MS Access的TRANSFORM ... PIVOT语句没什么相似之处,但您可以利用动态SQL来实现目标。

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
         CONCAT('SUM(CASE WHEN worked_date = ''', worked_date,
                ''' THEN hours END) `', worked_date, '`'))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT user, ', @sql, ' 
                     FROM table1 
                    GROUP BY user');

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

输出:

| User | 2017-01-04 | 2017-02-04 |
|------|------------|------------|
| Bill |          8 |          6 |
|  Bob |          7 |     (null) |

这是SQLFiddle

您可以将其包装在存储过程中以简化客户端代码中的内容

DELIMITER $$
CREATE PROCEDURE user_worked_hours()
BEGIN
    SET @sql = NULL;

    SELECT GROUP_CONCAT(DISTINCT
             CONCAT('SUM(CASE WHEN worked_date = ''', worked_date,
                    ''' THEN hours END) `', worked_date, '`'))
      INTO @sql
      FROM table1;

    SET @sql = CONCAT('SELECT user, ', @sql, ' 
                         FROM table1 
                        GROUP BY user');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

然后使用它:

CALL user_worked_hours();

这是SQLFiddle