mysql行列转换

本文介绍了如何在SQL中进行行转列和列转行的操作。通过示例展示了如何使用UNION和CASE语句将不同列的值取别名后求并集,以及如何在列传行时利用GROUP BY和IF函数进行数据重组。讨论了在列转行过程中聚合函数的使用,并提供了一个错误验证示例,强调了在不同条件下聚合函数的正确应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

行转列

sql架构

CREATE TABLE demo1(
`id` INT,
`store1` INT,
`store2` INT,
`store3` INT
);

INSERT INTO demo1 (id, store1, store2, store3) VALUES (0, 95, 100, 105);
INSERT INTO demo1 (id, store1, store2, store3) VALUES (1, 70, NULL, 80);

select  * from demo1

在这里插入图片描述

操作:分别查询每行不同列的值取别名后求并集

SELECT id,'store1' AS  store  ,store1 AS price FROM demo1 WHERE store1 IS NOT NULL
UNION 
SELECT id,'store2' AS  store, store2 AS price FROM demo1 WHERE store2 IS NOT NULL
UNION 
SELECT id, 'store3' AS store, store3 AS price FROM demo1 WHERE store3 IS NOT NULL

在这里插入图片描述

列传行

同理

CREATE TABLE demo(
`id` INT,
`store` VARCHAR(10),
price INT 
);

INSERT INTO demo VALUES(0,'store1',95);
INSERT INTO demo VALUES(0,'store2',100);
INSERT INTO demo VALUES(0,'store3',105);
INSERT INTO demo VALUES(1,'store1',70);
INSERT INTO demo VALUES(1,'store3',80);

SELECT * FROM demo;

在这里插入图片描述

操作,使用group分组并且匹配属性与属性值

SELECT id,
MAX(IF(store='store1',price,NULL)) AS 'store1',
MAX(IF(store='store2',price,NULL)) AS 'store2',
MAX(IF(store='store3',price,NULL)) AS 'store3'
FROM demo 
GROUP BY id;

tips:虽然笔者明白使用group操作除了分组使用的字段其他字段都需要使用聚合函数,但是却误以为此时聚合函数不生效,其实是生效的,只不过没有同一id,store的情况下,有多个price的值。此时我再添加在此环境下一个实际上不可能的记录,完成验证。因此,在列传行情况下可以使用不同的聚合函数,sum,min,max都可以,结合需求的需要使用。

INSERT INTO demo VALUES(1,'store3',81);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值