我开始使用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
答案 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) |
您可以将其包装在存储过程中以简化客户端代码中的内容
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();