Запрос mysql с группировкой и объединением строк в одну строку

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

Запрос mysql с группировкой и объединением строк в одну строку

Я написал запрос sql:

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

и результат выглядит так:

Запрос mysql с группировкой и объединением строк в одну строку

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

Запрос mysql с группировкой и объединением строк в одну строку

Я пытался получить это с помощью 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

Буду очень благодарен за помощь.

Используйте инструкцию case внутри Group_concat

Kaushik 17.12.2018 10:26

Как то так -> Ссылка на сайт

Kaushik 17.12.2018 10:28

Но как мне рассчитать количество_контактов для каждой функции group_concat и слов CASE и WHEN?

Krzysztof Michalski 17.12.2018 10:54

обновил рабочий пример

Kaushik 17.12.2018 10:57
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
38
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать 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();

Посмотреть результаты рабочий пример

Ответ принят как подходящий

Вы можете использовать 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

Другие вопросы по теме