Mysql 如何避免组_CONCAT()行乘以我的总和()
因此,我有一个查询谁检索支持票证,并使用Mysql 如何避免组_CONCAT()行乘以我的总和(),mysql,sql,Mysql,Sql,因此,我有一个查询谁检索支持票证,并使用GROUP\u CONCAT()im检索一行上的每个票证状态,以在PHP中作为数组进行处理 我的问题是,在查询中,我有一个SUM()从他的干预中获取每张票据的时间支出,但是,例如,如果GROUP\u CONCAT()检索12个状态,票据总和为2400秒,SUM()的最终结果为2400 x 12=28800 我的问题是: SELECT t.subject as theme, SUM(fd.duree) as time, t.datec, t.date_clo
GROUP\u CONCAT()
im检索一行上的每个票证状态,以在PHP中作为数组进行处理
我的问题是,在查询中,我有一个SUM()
从他的干预中获取每张票据的时间支出,但是,例如,如果GROUP\u CONCAT()
检索12个状态,票据总和为2400秒,SUM()
的最终结果为2400 x 12=28800
我的问题是:
SELECT t.subject as theme, SUM(fd.duree) as time, t.datec, t.date_close, t.category_code as category, GROUP_CONCAT(DISTINCT IFNULL(tl.status, 0),'_',tl.datec ORDER BY tl.datec) as status
FROM llx_ticketsup as t
JOIN llx_societe as s on s.rowid = t.fk_soc
JOIN llx_user as u on u.rowid = t.fk_user_assign
JOIN llx_element_element as ee on ee.fk_source = t.rowid
JOIN llx_fichinter as f on f.rowid = ee.fk_target
JOIN llx_fichinterdet as fd on fd.fk_fichinter = f.rowid
JOIN llx_ticketsup_logs as tl on tl.fk_track_id = t.track_id
WHERE t.fk_statut = 8
AND t.fk_soc = 165
AND (STR_TO_DATE(t.date_close, '%Y-%m-%d') BETWEEN '2018-06-25' AND '2018-06-25 23:59:59')
GROUP BY t.rowid
结果:
它应该有2400个准时,但正乘以他的12个状态
如果我也按状态分组,你可以看到时间很好,但我只需要一行,其中包含ticket real time expent和他的状态
我的问题是,如何避免GROUP_CONCAT()
行不乘以我的SUM()
*编辑:我通过除以
总和(fd.duree)/COUNT(DISTINCT tl.rowid)
来实现它。我知道这是一个奇怪的修复,但不知道如何否则。如果有人有任何建议,我将不胜感激。谢谢 Hi@Roms,我认为时间上28800的值,不是因为Group_Concat函数,而是因为你在上面使用了SUM()。它基本上会将该组的“时间”列中的所有值相加并显示出来。如果希望通过在最终结果中显示2400来保持时间常数,可以将SUM(fd.duree)替换为time,将MAX(fd.duree)替换为time。这应该可以解决它。如果有帮助,请告诉我。@MayankPorwal谢谢你的回答。情况是,SUM(fd.duree)
是票据的每个干预的总和(一张票据可以有一个或多个干预)。时间列不直接在票证表上。这就是做SUM()
的要点。如果我做了MAX()
,当2400是正确的数字时,我有1200,因为这张票有2个干预。如果在查询中我删除了GROUP\u CONCAT()
列,结果很好(2400),但我需要票证状态。将GROUP\u CONCAT推到子查询中。@P.Salmon感谢您的回答。你到底是什么意思,推进到一个子查询?在第一个选择中查询选择?谢谢。谢谢,但仍然获得第一张图中显示的实时*状态行数(28800):/好的,如果删除表S、U和更重要的TL的连接,会怎么样?是的,现在正在工作!谢谢因此,将JOIN
移动到SELECT
子查询中可以很好地工作,而无需将每个GROUP\u CONCAT
行的聚合函数相乘。
SELECT t.subject as theme,
SUM(fd.duree) as time,
t.datec, t.date_close,
t.category_code as category,
(SELECT GROUP_CONCAT(DISTINCT COALESCE(l.status, 0),'_',l.datec ORDER BY l.datec)
FROM llx_ticketsup_logs AS l WHERE fk_track_id = t.track_id) as status
FROM llx_ticketsup as t
JOIN llx_element_element as ee on ee.fk_source = t.rowid
JOIN llx_fichinter as f on f.rowid = ee.fk_target
JOIN llx_fichinterdet as fd on fd.fk_fichinter = f.rowid
WHERE t.fk_statut = 8
AND t.fk_soc = 165
AND (STR_TO_DATE(t.date_close, '%Y-%m-%d') BETWEEN '2018-06-25' AND '2018-06-25 23:59:59')
GROUP BY t.rowid