Mysql多表联合查询,行转列

项目中,所有的字段是通过key和value的形式存放的,以至于导致查询某一个人的数据,需要进行判断,
一开始在网上找了很多,大部分都是 一样demo,
第一次尝试,结果不是我想要的

select id,project_id,
sum(if(`variable`='SITEID',variable_value,null)) as core_code,
sum(if(`variable`='CRFVER',variable_value,null)) as crf_version,
 create_time,update_time,create_by,update_by,is_deleted
from (
	SELECT
		crfSubject.id,
		crfSubject.project_id,
		crfSubject.centre_id,
		subDetails.variable,
		subDetails.variable_name,
		subDetails.variable_value,
		subData.create_time,
		subData.update_time,
		subData.create_by,
		subData.update_by,
		crfSubject.is_deleted 
	FROM
		edc_crf_subject AS crfSubject
		LEFT JOIN edc_crf_subject_data AS subData ON crfSubject.id = subData.subject_id
		LEFT JOIN edc_crf_subject_data_details AS subDetails ON subData.id = subDetails.subject_data_id 
	WHERE
		subData.crf_name = 'SUBJECT' 
		AND subDetails.is_deleted = '0' 
	) AS info 
GROUP BY
	id;
	

core_code是字符,但却搞成 了数字 ,问题就出在sum ,所以 如果不是计算类型的,最好不要用su
在这里插入图片描述
最后使用max


	
	select id,
	max(	if(variable='SUBJID',variable_value,null)) as sub_code,
	max(	if(variable='SITEID',variable_value,null)) as core_code,
max(	if(variable='SITENAME',variable_value,null)) as core_name,
max(	if(variable='STATUS',variable_value,1)) as sub_status,
max(	if(variable='CRFVER',variable_value,null)) as crf_version,
max(	if(variable='CRFSTS',variable_value,1)) as crf_status,
max(	if(variable='COUNTRY',variable_value,null)) as county,
max(	if(variable='INVNAM',variable_value,null)) as invnam,
max(	if(variable='STUDYID',variable_value,null)) as study_id,
create_time,create_by,update_time,update_by,is_deleted
from (
	SELECT
		crfSubject.id,
		crfSubject.project_id,
		crfSubject.centre_id,
		subDetails.variable,
		subDetails.variable_name,
		subDetails.variable_value,
		subData.create_time,
		subData.update_time,
		subData.create_by,
		subData.update_by,
		crfSubject.is_deleted 
	FROM
		edc_crf_subject AS crfSubject
		LEFT JOIN edc_crf_subject_data AS subData ON crfSubject.id = subData.subject_id
		LEFT JOIN edc_crf_subject_data_details AS subDetails ON subData.id = subDetails.subject_data_id 
	WHERE
		subData.crf_name = 'SUBJECT' 
		AND subDetails.is_deleted = '0') as base_info group by id;

得到想要的结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL中的行转列(也称为“pivot”或“交叉表”操作)是一种数据转换技术,用于将一行数据中的某个字段值作为新名,将该字段对应的值放在对应的中。这种操作在汇总或分析多维数据时非常有用,特别是当你需要按照不同的分类对数据进行分组和计数时。 在标准SQL中,没有内置的行转列函数或命令,但可以通过联合(JOIN)、子查询、CASE语句或者使用特定数据库系统的扩展功能(如MySQL的PIVOT或T-SQL的UNPIVOT)来实现。这里是一个简单的例子: 假设你有一个销售数据表(sales),其中包含产品(product)和销售额(amount)两个字段,你想按产品种类(product_type)将总销售额转为各个类型单独的: 原始表(销售数据表): | product | amount | |---------|--------| | A | 100 | | B | 200 | | A | 150 | | C | 300 | | B | 250 | 行转列后的结果可能如下(假设产品A的类型是'Electronics',B的类型是'Clothing'): | product_type | Electronics | Clothing | |-------------|-------------|----------| | Sales | 250 | 450 | 在实际操作中,你可以使用以下SQL查询(假设MySQL的PIVOT语法): ```sql SELECT * FROM ( SELECT product, product_type, amount FROM sales ) AS source PIVOT ( SUM(amount) FOR product_type IN ('Electronics', 'Clothing') ) AS pivot_table; ``` 如果你使用的是不支持PIVOT的SQL版本,你可能需要编写更复杂的子查询或临时表来完成相同的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值