WITH TEMP_TABLE AS(SELECT'12楼' FLOOR,'a' NAME,'10' AGE,'11' NB FROM DUAL
UNIONALLSELECT'12楼' FLOOR,'a' NAME,'20' AGE,'11' NB FROM DUAL
UNIONALLSELECT'12楼' FLOOR,'b' NAME,'30' AGE,'12' NB FROM DUAL
UNIONSELECT'12楼' FLOOR,'c' NAME,'40' AGE,'13' NB FROM DUAL
UNIONSELECT'19楼' FLOOR,'d' NAME,'20' AGE,'14' NB FROM DUAL
)--除去AGE和NAME字段之外的字段分组,把NAME字段的值等于IN()里面的值进行“行转列”,之后再根据前面的聚合函数计算SELECT*FROM TEMP_TABLE PIVOT(SUM(AGE)FOR NAME IN('a','b'))
LISTAGG() WITHIN GROUP () 行转列(多行合并一行)
WITH TEMP_TABLE AS(SELECT'12楼' FLOOR,'a' NAME,'10' AGE,'11' NB FROM DUAL
UNIONALLSELECT'12楼' FLOOR,'a' NAME,'20' AGE,'11' NB FROM DUAL
UNIONALLSELECT'12楼' FLOOR,'b' NAME,'30' AGE,'12' NB FROM DUAL
UNIONSELECT'12楼' FLOOR,'c' NAME,'40' AGE,'13' NB FROM DUAL
UNIONSELECT'19楼' FLOOR,'d' NAME,'20' AGE,'14' NB FROM DUAL
)--该函数必须配合 GROUP BY 使用,根据FLOOR为主,NAME字段的值多行转为一行(行转列)SELECT FLOOR,LISTAGG(NAME,',')WITHINGROUP(ORDERBY NAME)AS NAMES FROM TEMP_TABLE GROUPBY FLOOR
UNPIVOT ( V FOR K IN (A, B, C)) 列转行
WITH TEMP_TABLE AS(SELECT'12楼' FLOOR,'a' NAME,'10' AGE,'11' NB FROM DUAL
UNIONALLSELECT'19楼' FLOOR,'d' NAME,'20' AGE,'14' NB FROM DUAL
)--把一行数据根据某个字段为主,其他字段转化成与之对应的数据SELECT FLOOR,ZiDuan,Zhi FROM TEMP_TABLE UNPIVOT(Zhi FOR ZiDuan IN(NAME, AGE, NB))
分析函数
OVER( PARTITION BY 字段 ORDER BY 字段)
OVER() 前面须是聚合函数,和GROUP BY 的区别是,GROUP BY 之后只有一条数据,OVER()后原数据条数不变,多了一个分析字段
WITH TEMP_TABLE AS(SELECT'12楼' FLOOR,'a' NAME,'20' AGE FROM DUAL
UNIONALLSELECT'12楼' FLOOR,'b' NAME,'30' AGE FROM DUAL
UNIONSELECT'12楼' FLOOR,'c' NAME,'40' AGE FROM DUAL
UNIONSELECT'19楼' FLOOR,'d' NAME,'20' AGE FROM DUAL
)--根据floor分组,后count()统计;SELECT NAME,FLOOR,COUNT(*)OVER(PARTITIONBY FLOOR)FROM TEMP_TABLE
--PARTITION BY 和 ORDER BY 如果字段不一致,则是根据 ORDER BY 后面的字段排序之后,每条数据累加--PARTITION BY 和 ORDER BY 如果字段一致,则加不加 ORDER BY 没区别SELECT NAME,FLOOR,COUNT(*)OVER(PARTITIONBY FLOOR ORDERBY NAME)FROM TEMP_TABLE
--COUNT()也可以换成SUM(),MAX(),MIN()等其他聚合函数;SUM()中的字段可以和COUNT()中的字段不同SELECT NAME,FLOOR,SUM(AGE)OVER(PARTITIONBY FLOOR)FROM TEMP_TABLE
--例子一:只会展示table1中id=1的数据WITH TABLE1 AS(SELECT'1'AS ID FROM DUAL
UNIONALLSELECT'11'AS ID FROM DUAL
),
TABLE2 AS(SELECT'1'AS ID FROM DUAL
)SELECT*FROM TABLE1 WHEREEXISTS(SELECT*FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)--例子二:无数据WITH TABLE1 AS(SELECT'1'AS ID FROM DUAL
UNIONALLSELECT'11'AS ID FROM DUAL
),
TABLE2 AS(SELECT'2'AS ID FROM DUAL
)SELECT*FROM TABLE1 WHEREEXISTS(SELECT*FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)
NOT EXISTS()
和exists() 完全相反。
ANY
any 就是匹配集合中的任意一个就满足条件了。
--table1 的每条数据,只要qty > 括号中数据的任意一条,Table1 中的该条数据就满足SELECT*FROM TABLE1 WHERE qty >ANY(SELECT qty FROM table2)
ALL
all 要跟所有的都比较,所有都满足以后才为真。
--table1 的每条数据,只要qty < 括号中的全部数据,Table1 中的该条数据才满足SELECT*FROM TABLE1 WHERE qty <ALL(SELECT qty FROM table2)ORDERBY qty;
SOME
等同于 IN
SELECT*FROM TABLE1 WHERE qty =SOME(SELECT qty FROM table2)ORDERBY qty;