mysql 将行分组和连接成一行的查询

mysql query with grouping and concatenate rows into one row

我在 mysql 中有 table 记录:

我写了 sql 查询:

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

结果如下:

我想获得如下信息(基于以上数据):

我试图通过使用 my_sql_function GROUP_CONCAT 通过 sql 查询获得它,但它不起作用:

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

非常感谢您的帮助。

您可以在 MySQL

中使用 Concat
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();

查看结果 fiddle

您可以在子查询中使用 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

请根据您的要求找到以下工作代码:

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