求教使用GROUP_CONCAT后字段的求和问题

yoyo_ yoyo_ 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
commissioner 表如下:


arrangement 表如下:


现有sql语句如下:

DROP TABLE IF EXISTS temp_arrangement;
CREATE TABLE temp_arrangement
SELECT
`arrangement`.`id`,
`arrangement`.`projectid`,
`arrangement`.`courseid`,
`arrangement_date`.`date` AS `traindate`,
GROUP_CONCAT(`arrangement`.`teacherid` ORDER BY `arrangement`.`teacherid` ASC) AS `teacherids`,
`arrangement`.`commissionerids` AS `commissionerids`,
GROUP_CONCAT(DISTINCT `commissioner`.`name` ORDER BY `commissioner`.`id` ASC) AS `commissionernames`,
`arrangement`.`time`,
`arrangement`.`traindays`,
SUM(CASE WHEN `arrangement`.`traindays`=0 THEN `arrangement`.`time` ELSE `arrangement`.`traindays` END) AS `usetime`
FROM
`arrangement`
INNER JOIN
`arrangement_date`
ON
DATE(`arrangement_date`.`date`) BETWEEN DATE(`arrangement`.`startdate`) AND DATE(`arrangement`.`enddate`)

LEFT JOIN
`commissioner`
ON FIND_IN_SET(`commissioner`.`id`,`arrangement`.`commissionerids`)

WHERE DATE( `arrangement_date`.`date`) BETWEEN DATE('2015-07-01') AND DATE('2015-07-10')

GROUP BY `arrangement`.`projectid`,`arrangement`.`courseid`, `arrangement_date`.`date` ;

SELECT a.* FROM temp_arrangement AS a ORDER BY
(SELECT MIN(b.traindate) FROM temp_arrangement AS b WHERE projectid=a.projectid),a.projectid,a.traindate;



执行结果如下图所示:


想实现GROUP_CONCAT('`arrangement`.`teacherid`')之后的teacherids不重复,且usetime应该以teacherids的个数为根据来进行求和,即:teacherids去重复后,如果teacherids为单个数字,没有逗号分隔,则usetime对应的应该是1,而不是上图中的2。
当然,GROUP_CONCAT(DISTINCT `arrangement`.`teacherid`)可以去重复,但usetime却不是想要 的效果。

想请教各位达人,要实现下图这种效果,要怎么改进sql语句呢?








...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
yoyo_
MySQL 57,062 成员 56,759 内容