DB2 行转列 + 列转行(附案例数据)

练习数据在文末,使用时需要修改表名,和建表语句

记得之前自己在网上找DB2行专列和列转行的文章时,找了很多都不能看懂,比如很多文章都没用心写,没有执行结果、没案例,然后我开始自己写文章。希望大家都能掌握DB2列转行、行转列知识点。

目录:
1、DB2列转行
2、DB2行转列
3、案例数据

1、DB2列转行

先看下源表

select * from TJSXM.water_quality_temp


函数格式:
DB2列转行不能使用函数unpivot,也没找到相应的函数格式,带大家从案例里面体会

问题1:把PJJG后的字段转换为行

select 
a.NF,a.YF,a.HL,a.DMMC,a.DMLX ,a.PJJG,q.polutcode,q.polut_value
from TJSXM.water_quality a,
TABLE (VALUES
('Ph(pH无量纲)',a.JCXM_PH),
('溶解氧',a.JCXM_RYL),
('高锰酸盐指数',a.JCXM_GMSYZS),
('生化需氧量(BOD5)',a.JCXM_SHXYL),
('氨氮',a.JCXM_AD),
('石油类(石油醚萃取)',a.JCXM_SYL),
('挥发酚',a.JCXM_HFF),
('汞',a.JCXM_GONG),
('铅',a.JCXM_QIAN),
('镉',a.JCXM_GE),
('阴离子表面活性剂',a.JCXM_YLZBMHXJ),
('铬(六价)',a.JCXM_LUO),
('氟化物(以F-计)',a.JCXM_FHW),
('总磷(以P计)',a.JCXM_ZL),
('氰化物',a.JCXM_QHW),
('硫化物',a.JCXM_LHW),
('砷',a.JCXM_SHEN),
('化学需氧量(CODcr)',a.JCXM_HXXYL),
('铜',a.JCXM_TONG),
('锌',a.JCXM_XIN),
('硒(四价)',a.JCXM_XI)
)
AS q(polutcode, polut_value)
#每个values中对应列的数据类型必须相同,值可以任意,如1,2,3,4都是整形

下面解释一下执行的过程:
核心是用table函数创建了一个表,这个表是用value实现的多行表,value实现虚表的例子:

所不同的是这里跟from子句中的一个表产生了关系,取出了表中的一列作为数据。参考文章:db2中的列转行和行转列

我们看下列转行结果:

2、DB2行转列

函数格式
很遗憾DB2行转列不能使用unpivot函数,只能用max函数。我们一起写下吧

问题2:把CODE_POLLUTE 污染物编码字段以列的方式显示

select
  NF,YF,HL,DMMC,PJJG,
 max(case when  CODE_POLLUTE = 'JCXM_PH'then POLLUTEVALUE end) JCXM_PHJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_RYL'then POLLUTEVALUE end) JCXM_RYLJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_GMSYZS'then POLLUTEVALUE end) JCXM_GMSYZSJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_SHXYL'then POLLUTEVALUE end) JCXM_SHXYLJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_AD'then POLLUTEVALUE end) JCXM_ADJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_SYL'then POLLUTEVALUE end) JCXM_SYLJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_HFF'then POLLUTEVALUE end) JCXM_HFFJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_GONG'then POLLUTEVALUE end) JCXM_GONGJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_QIAN'then POLLUTEVALUE end) JCXM_QIANJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_GE'then POLLUTEVALUE end) JCXM_GEJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_YLZBMHXJ'then POLLUTEVALUE end) JCXM_YLZBMHXJJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_LUO'then POLLUTEVALUE end) JCXM_LUOJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_FHW'then POLLUTEVALUE end) JCXM_FHWJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_ZL'then POLLUTEVALUE end) JCXM_ZLJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_QHW'then POLLUTEVALUE end) JCXM_QHWJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_LHW'then POLLUTEVALUE end) JCXM_LHWJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_SHEN'then POLLUTEVALUE end) JCXM_SHENJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_HXXYL'then POLLUTEVALUE end) JCXM_HXXYLJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_TONG'then POLLUTEVALUE end) JCXM_TONGJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_XIN'then POLLUTEVALUE end) JCXM_XINJCXM_PH ,
max(case when  CODE_POLLUTE = 'JCXM_XI'then POLLUTEVALUE end) JCXM_XIJCXM_PH 
 from  water_quality_temp ----已存在数据库中
 group by NF,YF,HL,DMMC,PJJG

我们看下运行结果:

3、案例数据

使用时需要数据库修改表名,和建表语句
建表语句

CREATE TABLE water_quality  ( 
	NF           	varchar(20) NULL,
	YF           	varchar(20) NULL,
	HL           	varchar(50) NULL,
	DMMC         	varchar(50) NULL,
	PJJG         	varchar(50) NULL,
	JCXM_PH      	varchar(50) NULL,
	JCXM_RYL     	varchar(50) NULL,
	JCXM_GMSYZS  	varchar(50) NULL,
	JCXM_SHXYL   	varchar(50) NULL,
	JCXM_AD      	varchar(50) NULL,
	JCXM_SYL     	varchar(50) NULL,
	JCXM_HFF     	varchar(50) NULL,
	JCXM_GONG    	varchar(50) NULL,
	JCXM_QIAN    	varchar(50) NULL,
	JCXM_GE      	varchar(50) NULL,
	JCXM_YLZBMHXJ	varchar(50) NULL,
	JCXM_LUO     	varchar(50) NULL,
	JCXM_FHW     	varchar(50) NULL,
	JCXM_ZL      	varchar(50) NULL,
	JCXM_QHW     	varchar(50) NULL,
	JCXM_LHW     	varchar(50) NULL,
	JCXM_SHEN    	varchar(50) NULL,
	JCXM_HXXYL   	varchar(50) NULL,
	JCXM_TONG    	varchar(50) NULL,
	JCXM_XIN     	varchar(50) NULL,
	JCXM_XI      	varchar(50) NULL )

插入数据
数据量太大这里给大家提供网盘。
网盘链接:https://pan.baidu.com/s/1nTMvJopi9KJFnWOEEHXmQw
提取码:msoh

猜你喜欢

转载自blog.csdn.net/yuandongmei23/article/details/107600953