我有一个表emp_sample,其字段为emp_code,alloc_date,alloc_hrs。我希望显示每周的分配小时总数,其中年份和周数作为其列名动态地为mysql过程中的任意数量的记录 这是我的代码
SET @sql = NULL;
SET SESSION group_concat_max_len = 1000000;
SELECT GROUP_CONCAT(DISTINCT
(CONCAT ('MAX(CASE WHEN alloc_date=''',
alloc_date,
''' THEN concat(alloc_hrs) END) `',
year(alloc_date),date_format(alloc_date,'%b'),week(alloc_date),
'week`'
))
)
INTO @sql
FROM emp_sample;
SET @sql = CONCAT('SELECT emp_code, ', @sql,' FROM emp_sample group by emp_code');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我希望我的输出像
emp_code julweek30 julweek31 ......
2145 5 3
2146 4 2
这个值应该是每周emp_code的count(alloc_date)。我希望这只能用mysql完成
答案 0 :(得分:0)
看起来您需要暂时存储第一个查询的结果并使用它来形成第二个查询,我建议如下:
更改第一个查询,使其在结果中返回alloc_date
和label
,而不仅仅是alloc_date
,例如:
date | label
31/7/2017 | julweek31
将结果存入内存(使用php / java代码)
遍历结果并动态生成第二个查询。对于第一个结果中的每一行,第二个查询中都会有一个内部SELECT
语句,例如:
SELECT es.emp_code,
(SELECT COUNT(*) FROM emp_sample WHERE emp_code = es.emp_code AND alloc_date = <date_of_row_1>) AS <label_of_row_1>
FROM emp_sample es
GROUP BY es.emp_code
内部SELECT
语句的数量将等于第一个查询返回的行数。
这应该会给你想要的结果。