Как избежать того, чтобы строки GROUP_CONCAT () умножали мой SUM ()

0

Таким образом, у меня есть запрос, который извлекает билеты поддержки и с помощью GROUP_CONCAT() im извлекает каждый статус билета в одной строке, чтобы выполнить PHP в качестве массива.

Моя проблема заключается в том, что по запросу у меня есть SUM() чтобы получить время на каждый билет из его интервенций, но, например, если GROUP_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

Результат:

Изображение 174551

Он должен иметь 2400 вовремя, но умножается на 12 его статусов.

Если я группирую по статусам тоже, время хорошо, как вы можете видеть, но мне нужна только одна строка с расширением реального времени в билете и конкатенацией его статусов.

Изображение 174551

Мой вопрос: как избежать строк GROUP_CONCAT() чтобы не умножать мой SUM()?

* EDIT: я сделал это, разделив SUM(fd.duree)/COUNT(DISTINCT tl.rowid). Я знаю, что это странное решение, но не знаю, как это сделать. Если у кого-нибудь есть какое-то предложение, он это оценит. Спасибо!

  • 0
    Привет @Roms, я думаю, что значение 28800 по времени, не из-за функции Group_Concat, а потому, что вы используете SUM () на нем. Он в основном добавляет все значения в столбец «время» для этой группы и отображает его. Если вы хотите сохранить постоянную времени, показав 2400 в конечном результате, вы можете заменить SUM (fd.duree) как время на MAX (fd.duree) как время. Это должно это исправить. Позвольте мне знать, если это помогает.
  • 0
    @MayankPorwal Спасибо за ваш ответ. Дело в том, что SUM(fd.duree) является суммой каждого вмешательства в билете (один билет может иметь одно или несколько вмешательств). Столбец времени не находится непосредственно в таблице билетов. Так вот в чем смысл делать SUM() . Если я выполняю MAX() , у меня 1200, когда 2400 - правильный номер, потому что в этом билете 2 вмешательства. Если в запросе я удаляю столбец GROUP_CONCAT() , результат будет хорошим (2400), но мне нужны статусы заявок.
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ
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
  • 0
    Спасибо, но все еще получаем количество строк статусов в реальном времени * (28800), как показано на первом изображении: /
  • 0
    Хорошо, что, если вы удалите JOINs к таблицам S, U и, что более важно, TL?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню