首页 > 解决方案 > 基于字段值的行到列

问题描述

我有两张桌子,docspeople

我想group_concat基于people.type并拥有type它自己的专栏。

表模式和数据:

CREATE TABLE IF NOT EXISTS `people` (
    `id` int(6) unsigned NOT NULL,
    `doc_id` varchar(6) NOT NULL,
    `type` varchar(6) NOT NULL,
    `firstname` varchar(25) NOT NULL,
    `lastname` varchar(25) NOT NULL
      ) DEFAULT CHARSET=utf8;

INSERT INTO people (`id`, `doc_id`,`type`,`firstname`,`lastname`) VALUES
('1','ABC001','From','John','Smith'),
('2','ABC001','To','Jonas','Doot'),
('3','ABC001','To','John','Howard'),
('4','ABC002','From','Holland','Jones'),
('5','ABC002','To','Tim','Jones'),
('6','ABC002','To','Julia','Smith');

CREATE TABLE IF NOT EXISTS `docs` (
    `id` int(6) unsigned NOT NULL,
    `doc_id` varchar(6) NOT NULL
      ) DEFAULT CHARSET=utf8;

INSERT INTO docs (`id`,`doc_id`) VALUES 
('1', 'ABC001'),
('2', 'ABC002');

这是我目前所拥有的,它可以工作,但仍然有相同的“重复”行doc_id,我需要将相同的行“合并”doc_id为一个。

SELECT d.doc_id, 
       p.type, 
       CASE p.type WHEN 'From' 
            THEN GROUP_CONCAT(CASE WHEN p.type = 'From' 
                 THEN CONCAT(p.firstname,' ',p.lastname) END SEPARATOR '; ') END 'From', 
       CASE p.type WHEN 'To' 
            THEN GROUP_CONCAT(CASE WHEN p.type = 'To' 
                 THEN CONCAT(p.firstname,' ',p.lastname) END SEPARATOR '; ') END 'To' 
            FROM docs d 
      INNER JOIN people p ON d.doc_id = p.doc_id 
GROUP BY d.doc_id, p.type

我目前的输出是: 电流输出

我正在寻找的是:

doc_id       From             To
ABC001       John Smith       John Howard; Jonas Doot
ABC002       Holland Jones    Tim Jones; Julia Smith

SQL小提琴: http ://sqlfiddle.com/#!9/096f891/4

标签: mysql

解决方案


取出p.typeGROUP BY因此您不要将每种类型放在自己的行中。

此外,CASE表达式应该在GROUP_CONCAT. 聚合函数应该位于分组查询的顶层。

SELECT 
    d.doc_id, 
    GROUP_CONCAT(
        CASE p.type WHEN 'From' 
            THEN CONCAT(p.firstname,' ',p.lastname) 
        END
        SEPARATOR '; '
   ) 'From', 
   GROUP_CONCAT(
        CASE p.type WHEN 'To' 
            THEN CONCAT(p.firstname,' ',p.lastname) 
        END 
        SEPARATOR '; ') 'To' 
FROM docs d 
INNER JOIN people p ON d.doc_id = p.doc_id 
GROUP BY d.doc_id

推荐阅读