关于数据库表的列转行,合并多行数据的问题解决

7 篇文章 1 订阅
4 篇文章 0 订阅

问题描述

原始SQL是这样的:

SELECT
	i.f_info_id id,
	de.f_title title,
	de.f_meta_description decs,
	cu.f_key,
	cu.f_value 
FROM
	cms_info_detail de
	INNER JOIN cms_info i ON de.f_info_id = i.f_info_id
	INNER JOIN cms_node node ON node.f_node_id = i.f_node_id
	INNER JOIN cms_info_custom cu ON cu.f_info_id = i.f_info_id 
WHERE
	node.f_node_id = 69 
	OR node.f_parent_id = 69

得到的数据是:

在这里插入图片描述

此时的数据是很难在前端展示的,需要处理一下数据

处理数据

先是 列转行 ,就后面两列的数据处理一下
具体SQL是:

SELECT
		i.f_info_id id,
		de.f_title title,
		de.f_meta_description decs,
		( CASE cu.f_key WHEN "dept" THEN f_value ELSE NULL END ) AS dept,
		( CASE cu.f_key WHEN "location" THEN f_value ELSE NULL END ) AS location,
		( CASE cu.f_key WHEN "jobtype" THEN f_value ELSE NULL END ) AS jobtype,
		( CASE cu.f_key WHEN "responsibilities" THEN f_value ELSE NULL END ) AS responsibilities,
		( CASE cu.f_key WHEN "qualifications" THEN f_value ELSE NULL END ) AS qualifications,
		( CASE cu.f_key WHEN "type" THEN f_value ELSE NULL END ) AS type 
	FROM
		cms_info_detail de
		INNER JOIN cms_info i ON de.f_info_id = i.f_info_id
		INNER JOIN cms_node node ON node.f_node_id = i.f_node_id
		INNER JOIN cms_info_custom cu ON cu.f_info_id = i.f_info_id WHERE node.f_node_id = 69 
		OR node.f_parent_id = 69 

输出:
在这里插入图片描述

合并多行数据

需要用到的函数:
GROUP_CONCAT(m.modelName SEPARATOR ‘,’) modelName

1.GROUP_CONCAT()中的值为你要合并的数据的字段名;

SEPARATOR 函数是用来分隔这些要合并的数据的;

’ '中是你要用哪个符号来分隔;

2.必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并成一条记录,如图:
在这里插入图片描述
示例:


SELECT
	datas.id id,
	datas.title title,
	datas.decs description,
	GROUP_CONCAT( datas.location SEPARATOR '' ) 地点,
	GROUP_CONCAT( datas.jobtype SEPARATOR '' ) 工作类型,
	GROUP_CONCAT( datas.responsibilities SEPARATOR '' ) 职责,
	GROUP_CONCAT( datas.qualifications SEPARATOR '' ) 要求,
	GROUP_CONCAT( datas.type SEPARATOR '' ) 招收来源,
	GROUP_CONCAT( datas.number SEPARATOR '' ) 数量,
	GROUP_CONCAT( datas.education SEPARATOR '' ) 受教育程度,
	GROUP_CONCAT( datas.experience SEPARATOR '' ) 经历
FROM
	(
	子查询(上面的SQL) datas 
GROUP BY
	id

输出:
在这里插入图片描述

完整SQL展示:


SELECT
	datas.id id,
	datas.title title,
	datas.decs description,
	GROUP_CONCAT( datas.location SEPARATOR '' ) 地点,
	GROUP_CONCAT( datas.jobtype SEPARATOR '' ) 工作类型,
	GROUP_CONCAT( datas.responsibilities SEPARATOR '' ) 职责,
	GROUP_CONCAT( datas.qualifications SEPARATOR '' ) 要求,
	GROUP_CONCAT( datas.type SEPARATOR '' ) 招收来源,
	GROUP_CONCAT( datas.number SEPARATOR '' ) 数量,
	GROUP_CONCAT( datas.education SEPARATOR '' ) 受教育程度,
	GROUP_CONCAT( datas.experience SEPARATOR '' ) 经历
FROM
	(
	SELECT
		i.f_info_id id,
		de.f_title title,
		de.f_meta_description decs,
		( CASE cu.f_key WHEN "location" THEN f_value ELSE NULL END ) AS location,
		( CASE cu.f_key WHEN "jobtype" THEN f_value ELSE NULL END ) AS jobtype,
		( CASE cu.f_key WHEN "responsibilities" THEN f_value ELSE NULL END ) AS responsibilities,
		( CASE cu.f_key WHEN "qualifications" THEN f_value ELSE NULL END ) AS qualifications,
		( CASE cu.f_key WHEN "type" THEN f_value ELSE NULL END ) AS type,
		( CASE cu.f_key WHEN "number" THEN f_value ELSE NULL END ) AS number,
		( CASE cu.f_key WHEN "education" THEN f_value ELSE NULL END ) AS education,
		( CASE cu.f_key WHEN "experience" THEN f_value ELSE NULL END ) AS experience
	FROM
		cms_info_detail de
		INNER JOIN cms_info i ON de.f_info_id = i.f_info_id
		INNER JOIN cms_node node ON node.f_node_id = i.f_node_id
		INNER JOIN cms_info_custom cu ON cu.f_info_id = i.f_info_id 
	WHERE
		node.f_node_id = 69 
		OR node.f_parent_id = 69 
	) datas 
GROUP BY
	id

参考:
SQL 列转行
mysql中将多行数据合并成一行数据

在HANA数据库中,要进行列转行的操作可以使用group_concat函数来实现。通过使用LEFT JOIN将两个连接在一起,并使用group_concat函数将多行数据合并成一行,从而实现列转行的效果。例如,可以使用以下SQL查询语句实现列转行操作: SELECT u.name1, GROUP_CONCAT(r.rolename, ' ') FROM user1 u LEFT JOIN role r ON u.id = r.user_id GROUP BY u.name1; [3] 这个查询语句会将user1和role连接起来,然后根据u.name1进行分组,并使用group_concat函数将相同name1的多个rolename值合并成一个字符串。通过这种方式,可以将多个行转换为一行,实现列转行的效果。请注意,这种方法在处理大量数据时可能会有限制,因为默认的类型是varchar类型,长度限制为4000,超过这个长度会报错。所以在处理大量数据时需要注意这个限制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【HANA系列】SAP HANA行列转换](https://blog.csdn.net/ARICK2014/article/details/101639998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据库列转行函数](https://blog.csdn.net/JerryBal/article/details/81129364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值