--(竖的数据表变成横的数据表)例子:
--创建tb_course表,并插入测试数据
CREATE TABLE tb_course(
NAME VARCHAR(20), ##姓名
course VARCHAR(20), ##课程
grade INT ##成绩
);
--并插入数据如下图所示:
--开始翻转
--方法一(在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;
--通过以上任意一种方法就可以变成如下图所示:
--(横的数据表变成竖的数据表)例子:
--以上图数据为基础:
--开始翻转
--方法(在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会对查询结果做排序。
个人总结:
对哪个字段为主体的就对该字段进行分组,这里如Name,而其他字段看情况而定,无非就是sum(字段名),这里需要注意的是条件,对里面的特殊字段也就是变换表成功后的除name字段外的字段作条件选择,if()条件,跟Java语言有所不同,但是原理都一样,a>b?a:b,if(等式,成立,不成立),可以取原表中的其他字段中的值,只需设置为其字段名就行。