MySQL запрос с группировкой и объединением строк в одну строку - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть таблица в MySQL с записями:

enter image description here

Я написал SQL-запрос:

SELECT COUNT(*) AS number_of_contacts, channel_id, direction
FROM cic_case_contacts
WHERE case_id = 328678
GROUP BY channel_id, direction

и результат выглядит следующим образом:

enter image description here

Я хотел бы получить что-то вроде ниже (на основе вышеуказанных данных):

enter image description here

Я пытался получить это с помощью SQL-запроса с помощью my_sql_function GROUP_CONCAT , но это не сработало:

SELECT COUNT(*) AS number_of_contacts, channel_id, GROUP_CONCAT(direction SEPARATOR ', ') AS directions
FROM cic_case_contacts
WHERE case_id = 328678 AND id IN(149196, 149195, 149194, 149193, 149192) AND `office_id` = 10
GROUP BY channel_id
ORDER BY channel_id

Я быбудьте благодарны за помощь.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать GROUP_CONCAT для подзапроса следующим образом:

SELECT channelid, GROUP_CONCAT(
    CONCAT(direction, ': ', c)
    ORDER BY direction
    SEPARATOR ', '
) AS summary
FROM (
    SELECT channelid, direction, COUNT(*) AS c
    FROM t
    GROUP BY channelid, direction
) x
GROUP BY channelid

Или просто использовать условное агрегирование:

SELECT channelid, CONCAT_WS(', ',
    CONCAT('in: ',  COUNT(CASE WHEN direction = 'in'  THEN 1 END)),
    CONCAT('out: ', COUNT(CASE WHEN direction = 'out' THEN 1 END))
) AS summary
FROM t
GROUP BY channelid
0 голосов
/ 17 декабря 2018

Пожалуйста, найдите ниже рабочий код согласно вашему требованию:

select tb.channelid, group_concat
(
  concat(tb.name,':',tb.MyCol2Count)

) as v1
from
(Select tbl.channelid,tbl.name,(LENGTH(tbl.val) - LENGTH(REPLACE(tbl.val,",","")) + 1) AS MyCol2Count
from 
(SELECT channelid, group_concat
(
  concat(name,':',channelid)

) as val,name
FROM Demo
group by channelid,Name) as tbl) as tb group by tb.channelid

Вы можете проверить на скриншоте ниже: http://springinfosoft.com/code/Groupby_code.png

0 голосов
/ 17 декабря 2018

Вы можете использовать Concat в MySQL

drop table if exists Demo;
CREATE TABLE Demo 
(
  ID INT AUTO_INCREMENT PRIMARY KEY,
  channelid int,
  Name VARCHAR(20)
);

INSERT INTO Demo(channelid, Name)VALUES
(1,'in'),(1,'out'),(1,'in'),(1,'out'),(2,'in'),(2,'out'),(1,'in'),(1,'out'),(1,'in'),(2,'out'),(2,'in'),(2,'out'),(2,'in'),(1,'in'),(1,'in');

Запрос

SELECT  SQL_CALC_FOUND_ROWS 
        channelid, 
        group_concat ( concat(name,':',channelid) ) 
FROM Demo
group by channelid;

SELECT FOUND_ROWS();

Посмотреть результаты the fiddle

...