数据库中的行列转换(横竖转换)

本文介绍如何使用SQL将竖向数据表转换为横向数据表,反之亦然。提供了三种不同的方法来实现表结构的翻转,并针对Oracle和MySQL数据库提出了具体的解决方案。

竖的数据表横的数据表)例子:

--创建tb_course表,并插入测试数据

CREATE TABLE tb_course(
NAME VARCHAR(20), ##姓名
course VARCHAR(20), ##课程
grade INT ##成绩
);

--测试数据

INSERT INTO tb_course (NAME,course,grade) VALUES('tom','JDBC',20);
INSERT INTO tb_course (NAME,course,grade) VALUES('tom','Hibernate',50);
INSERT INTO tb_course (NAME,course,grade) VALUES('tom','Spring',80);
INSERT INTO tb_course (NAME,course,grade) VALUES('marry','JDBC',30);
INSERT INTO tb_course (NAME,course,grade) VALUES('marry','Hibernate',60);
INSERT INTO tb_course (NAME,course,grade) VALUES('marry','Spring',70);

如图:


--开始做翻转

--方法一(在oracle同这种方法):

SELECT NAME,

SUM(DECODE(course,'JDBC',gradem,0)) JDBC,

SUM(DECODE(course,'Hibernate',gradem,0)) Hibernate,

SUM(DECODE(course,'Spring',gradem,0)) Spring

FROM tb_course GROUP BY NAME;

--方法二(在mysql用这种方法):

SELECT NAME,
SUM(IF(course='JDBC',grade,0)) JDBC,
SUM(IF(course='Hibernate',grade,0)) Hibernate,
SUM(IF(course='Spring',grade,0)) Spring
FROM tb_course GROUP BY NAME;

--方法三(这种方法比较麻烦,用自身做一个多表连接,字段多的时候很容易乱):
SELECT t4.name,t1.JDBC,t2.Hibernate,t3.Spring FROM
(SELECT NAME,grade AS JDBC FROM tb_course WHERE course = 'JDBC') t1,
(SELECT NAME,grade AS Hibernate FROM tb_course WHERE course = 'Hibernate') t2,
(SELECT NAME,grade AS Spring FROM tb_course WHERE course = 'Spring') t3, 
(SELECT DISTINCT NAME FROM tb_course) t4
WHERE t1.name = t4.name AND t2.name = t4.name AND t3.name = t4.name;

执行以上任意一种方法后表会变成:



###########################################################超级分割线###########################################################

(横的数据表变竖的数据表)例子:

--创建tb_courses表,并插入测试数据

CREATE TABLE tb_courses(
NAME VARCHAR(10),
JDBC INT,
Hibernate INT,
Spring INT
);

--测试数据

INSERT INTO tb_courses VALUES('tom',20,50,80);
INSERT INTO tb_courses VALUES('marry',30,60,70);

如图:


--开始做翻转

--方法一(在oracle 与mysql都可用这种方法):

(SELECT NAME,'JDBC' COURSE,JDBC grade FROM tb_courses)
UNION
(SELECT NAME,'Hibernate' COURSE,Hibernate grade FROM tb_courses)
UNION
(SELECT NAME,'Spring' COURSE,Spring grade FROM tb_courses)
ORDER BY NAME DESC;

执行后表会变成:


温馨提示:

UNION与UNION ALL的区别:union与union all 都是查询结果的并集,但是union多了一步去重复数据,所以效率上没union all高,另外union会对查询结果做排序。








### 如何实现LCD显示屏的横竖转换 #### 理解默认显示方向 开发板配套的LCD屏通常默认为屏显示,例如4.3寸、7寸和10.1寸的不同分辨率RGB LCD屏均遵循这一设定[^1]。 #### Uboot与内核Logo旋转 为了使系统能够适应不同的屏幕方向,在Uboot阶段就需要调整logo的方向。这涉及到修改uboot源码中的display初始化部分,确保其可以识别并响应新的屏幕方向设置[^2]。 #### 图形界面框架下的解决方案 对于基于Linux系统的设备来说,可以通过图形栈来处理这个问题。具体而言: - **X Window System (X11)** 或者更现代的方式如Wayland, 可以通过配置文件改显示器属性; - 对于嵌入式GUI库(比如Qt或LVGL),则可以在应用层面控制画布尺寸及坐标系换[^3]。 #### LVGL实例分析 当使用LVGL作为UI引擎时,如果硬件本身并不支持物理上的转向,则可通过软件手段完此操作。例如针对RM690B0驱动IC的情况,利用LVGL提供的API函数`lv_disp_set_rotation()`来进行顺时针/逆时针90度翻转即可达到目的. ```c // 设置当前显示器对象disp到指定角度(这里假设ID=0) lv_disp_t * disp = lv_disp_get_by_id(0); if(disp != NULL){ lv_disp_set_rotation(disp,LV_DISP_ROT_90); // 将屏幕旋转至横向模式 } ``` #### 验证方法 一种简单的验证方式是在帧缓冲区(`fb0`)上写入已知大小的测试图案,并观察实际呈现效果是否符合预期。根据反馈情况进一步排查可能存在的参数错配问题,像line_length这样的关键值可能会引起视觉异常现象[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值