需求
将老师一周中同一大节的课表信息整理到同一条记录里,不同星期对应不同的列。(涉及到字符串拼接、行转列)
常见的行转列函数有vm_concat、listagg、xmlagg等,但是oracle12g不支持vm_concat,而且前两个函数在拼接字符串的时候容易出现拼接结果过长、字符串缓冲区过小等问题,难搞。xmlagg就可以完美解决这个问题,拼接字段中出现null也不影响,唯一的不足就是多个null拼接时,xmlagg并不能自动省去,最后需要处理下多余的拼接符号,不然难看。
xmlagg函数用法
xmlagg函数需要将输入的值转换为xml,处理返回结果也是xml,最后再用getclobval()获取colb类型的结果。
xmlagg(xmlelement(表名, 输入值1,输入值2) order by 参数).extract('//text()').getclobval()
输入值就是要拼接的字段和连接符,顺序随意,xmlagg就是把两个输入值拼在一起,连接符在前在后都一样,最后都是要处理下多余的字符的
listagg函数用法
listagg(参数, '分隔符') within group(order by 参数)
vm_concat函数用法
vm_concat(参数)
CREATE OR REPLACE VIEW LY_VIEW_MHZS_JSKCB11 AS
SELECT
XN,XQ,JC,GH,DSZ,
--将同一节次的课程信息进行列转行并去除多余的连接符
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.AKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS AKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.BKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS BKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.CKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS CKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.DKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS DKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.EKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS EKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.FKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS FKC,
TRIM(',' FROM XMLAGG(XMLELEMENT(T, ',', T.GKC) ORDER BY XN,XQ,JC,GH,DSZ).EXTRACT('//text()').GETCLOBVAL()) AS GKC
FROM (
SELECT
GH, --工号
A.XN||'-'||TO_CHAR(A.XN+1) AS XN, --学年
CASE JC IS NOT NULL THEN '第'||JC||'节' ELSE '【-】' END AS JC, --节次
XQ , --学期
DSZ, --单双周
--拼接课程信息
CASE WHEN XQJ='1' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS AKC,--星期一课程
CASE WHEN XQJ='2' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS BKC,--星期二课程
CASE WHEN XQJ='3' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS CKC,--星期三课程
CASE WHEN XQJ='4' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS DKC,--星期四课程
CASE WHEN XQJ='5' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS EKC,--星期五课程
CASE WHEN XQJ='6' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS FKC,--星期六课程
CASE WHEN XQJ='7' THEN '第'||ZC||'周【'||KCMC||'】'||SKDD||B.BJMC ELSE NULL END AS GKC--星期日课程
FROM JSKB A
LEFT JOIN
(
--拼接班级信息
SELECT A.XN,A.XQ,A.SKBJ,
SUBSTR(XMLAGG(XMLELEMENT(A, ',', A.BJMC) ORDER BY A.XN,A.XQ,A.SKBJ).EXTRACT('//text()').GETCLOBVAL(),2) AS BJMC
FROM BJXX A
GROUP BY A.XN,A.XQ,A.SKBJ
) B ON A.SKBJ=B.SKBJ AND A.XN=B.XN AND A.XQ=B.XQ
ORDER BY A.XN,A.XQ,A.ZJJS_GH,A.JCINFO
) T
GROUP BY XN,XQ,JC,GH,DSZ;
标签:XN,--,GH,视图,课表,DSZ,XQ,JC 来源: https://blog.csdn.net/Honghui_Wang/article/details/120392318
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。