mysql - 基于字段值的行到列
问题描述
我有两张桌子,docs
和people
。
docs
表包含:id
和doc_id
people
表包含:id
,doc_id
,type
,firstname
,lastname
我想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
解决方案
取出p.type
,GROUP 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
推荐阅读
- html - 为什么边距会影响我的内联块 div 是否会使用 flex-start 对齐到顶部?
- react-native - React-Native:未定义不是对象(评估'this.props = props')
- javascript - 使用 AWS-Amplify ->“放大推送”不起作用
- php - NTLM 身份验证弹出问题
- flutter - 如何将值传递给另一个类?
- ios - iOS SwiftUI:浅色/深色不会改变
- javascript - 如何将客户端事件处理程序附加到 Sapper 组件中的插槽?
- apache-pulsar - ApachePulsar:如何获取命名空间“sample/standalone/ns1”的策略?
- ios - 如何保护我的工作线程不被系统进程抢占?
- ios - Firebase 存储完成永远不会触发/被回调