Oracle-casewhen用法-行列转换
Oracle 行列转换
1、固定列数的行列转换
如
转换为
语句如下:
create table tb_chengji (student varchar2(20),subject varchar2(20),g rade num ber);
select student,
sum(case subject when'语文'then grade end)"语文",
sum(case subject when'数学'then grade end)"数学",
sum(case subject when'英语'then grade end)"英语",
sum(grade) "总分"
from tb_chengji
group by student;
或者
select student,
sum(decode(subject,'语文',grade,null)) "语文",
sum(decode(subject,'数学',grade,null)) "数学",
sum(decode(subject,'英语',grade,null)) "英语",
sum(grade) "总分"
from tb_chengji
group by student;
2、不定列行列转换
如
c1 c2
--- -----------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换可以借助于PL/SQL来完成,这里给一个例子
create table ttt (c1 number,c2 varchar2(10));
select*from ttt;
create or replace function get_c2(tmp_c1 number)
return varchar2
is
col_c2 varchar2(4000);
begin
for cur in(select c2 from ttt where c1=tmp_c1)loop
col_c2 := col_c2||cur.c2;
end loop;
col_c2 := rtrim(col_c2,1);
return col_c2;
end;
select distinct c1 ,get_c2(c1) cc2 from ttt
order by c1;
或者不用pl/sql,利用分析函数和CONNECT_BY 实现:
select c1, substr (max(sys_connect_by_path (c2,';')),2)name from(select c1, c2, rn, lead (rn) over (partition by c1 order by rn) rn1 from(select c1, c2, row_number () over (order by c2) rn
from ttt))
start with rn1 is null
connect by rn1 =prior rn
group by c1;
3、列数不固定(交叉表行列转置)
这种是比较麻烦的一种,需要借助pl/sql:
原始数据:
CLASS1 CALLDATE CALLCOUNT
1 2005-08-08 40
1 2005-08-07 6
2 2005-08-08 77
3 2005-08-09 33
3 2005-08-08 9
3 2005-08-07 21
转置后:
CALLDATE CallCount1 CallCount2 CallCount3
------------ ---------- ---------- ----------
2005-08-09 0 0 33
2005-08-08 40 77 9
2005-08-07 6 0 21
试验如下:
1). 建立测试表和数据
CREATE TABLE t22(
class1 VARCHAR2(2BYTE),
calldate DATE,
callcount INTEGER
);
INSERT INTO t22(class1, calldate, callcount)
VALUES('1', TO_DATE ('08/08/2005','MM/DD/YYYY'),40); INSERT INTO t22(class1, calldate, callcount)
VALUES('1', TO_DATE ('08/07/2005','MM/DD/YYYY'),6); INSERT INTO t22(class1, calldate, callcount)
VALUES('2', TO_DATE ('08/08/2005','MM/DD/YYYY'),77); INSERT INTO t22(class1, calldate, callcount)
VALUES('3', TO_DATE ('08/09/2005','MM/DD/YYYY'),33); INSERT INTO t22(class1, calldate, callcount)
VALUES('3', TO_DATE ('08/08/2005','MM/DD/YYYY'),9); INSERT INTO t22(class1, calldate, callcount)
VALUES('3', TO_DATE ('08/07/2005','MM/DD/YYYY'),21);
COMMIT ;
select calldate,
nvl(max(case when class1 =1then callcount end),0)a1, nvl(max(case when class1 =2then callcount end),0) a2, nvl(max(case when class1 =3then callcount end),0)a3 from t22
group by calldate
order by calldate desc;
CALLDATE CallCount1 CallCount2 CallCount3
------------ ---------- ---------- ----------
2005-8-9 0 0 33
2005-8-8 40 77 9
2005-8-7 6 0 21。
oracle sql case when用法
oracle sql case when用法Oracle SQL Case When用法Case When(case语句)是一种使用布尔表达式来遍历值的正确性的一种语句,也称为条件控制语句。
Case When 允许在Select语句中条件判断,可以根据多个不同条件返回多个结果,也可以用在Insert、Update、Delete句中来根据不同的条件作出不同的操作。
Case When 语法形式:CASEWHEN condition THEN resultWHEN condition THEN resultELSE resultENDCondition 代表一个布尔表达式,Result代表一个表达式;当condition为TRUE时,返回result;当所有的 condition都为FALSE 时,返回else的结果;下面以一个实例说明Case When 的使用:假设我们有一个表t1,有一列a,其值为1,2,3,4,5。
我们想要计算a的值,如果a的值小于3,就返回“小于3”,如果a的值大于等于3,就返回“大于等于3”,我们可以使用下面的Case When语句:SELECTtCASEttWHEN a < 3 THEN '小于3'ttELSE '大于等于3'tEND as bFROM t1;也可以更加具体的比如:SELECTtCASEttWHEN a = 1 THEN '等于1'ttWHEN a = 2 THEN '等于2'ttWHEN a > 2 THEN '大于2'tEND as bFROM t1;总之,Case When 是一种非常灵活的SQL语句,可以根据用户自定义的布尔表达式,计算出不同的值。
oracle case when 用法
oracle case when 用法Oracle的CASE WHEN语句是一种条件表达式,用于根据不同的条件执行不同的操作。
它可以在SELECT、UPDATE和DELETE语句中使用,以及在PL/SQL块中使用。
CASE WHEN语句可以根据一个或多个条件来判断,并根据条件的结果执行相应的操作。
CASE WHEN语句的基本语法如下:```CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE resultEND```其中,condition1、condition2等是条件表达式,result1、result2等是与条件对应的结果。
ELSE子句是可选的,用于指定当所有条件都不满足时的默认结果。
下面我们将详细介绍CASE WHEN语句的用法和示例。
1. 简单CASE WHEN语句简单CASE WHEN语句用于根据一个表达式的值来判断条件,并执行相应的操作。
下面是一个简单CASE WHEN语句的示例:```SELECT column1,CASE column2WHEN 'value1' THEN 'result1'WHEN 'value2' THEN 'result2'...ELSE 'result'END AS result_columnFROM table;```在上面的示例中,根据column2的值来判断条件,并将相应的结果赋值给result_column列。
2. 搜索CASE WHEN语句搜索CASE WHEN语句用于根据多个条件的结果来执行相应的操作。
下面是一个搜索CASE WHEN语句的示例:```SELECT column1,CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE resultEND AS result_columnFROM table;```在上面的示例中,根据condition1、condition2等条件的结果来执行相应的操作,并将结果赋值给result_column列。
Oracle-casewhen用法-行列转换
Oracle 行列转换1、固定列数的行列转换如转换为语句如下:create table tb_chengji (student varchar2(20),subject varchar2(20),g rade num ber);select student,sum(case subject when'语文'then grade end)"语文",sum(case subject when'数学'then grade end)"数学",sum(case subject when'英语'then grade end)"英语",sum(grade) "总分"from tb_chengjigroup by student;或者select student,sum(decode(subject,'语文',grade,null)) "语文",sum(decode(subject,'数学',grade,null)) "数学",sum(decode(subject,'英语',grade,null)) "英语",sum(grade) "总分"from tb_chengjigroup by student;2、不定列行列转换如c1 c2--- -----------1 我1 是1 谁2 知2 道3 不……转换为1 我是谁2 知道3 不这一类型的转换可以借助于PL/SQL来完成,这里给一个例子create table ttt (c1 number,c2 varchar2(10));select*from ttt;create or replace function get_c2(tmp_c1 number)return varchar2iscol_c2 varchar2(4000);beginfor cur in(select c2 from ttt where c1=tmp_c1)loopcol_c2 := col_c2||cur.c2;end loop;col_c2 := rtrim(col_c2,1);return col_c2;end;select distinct c1 ,get_c2(c1) cc2 from tttorder by c1;或者不用pl/sql,利用分析函数和CONNECT_BY 实现:select c1, substr (max(sys_connect_by_path (c2,';')),2)name from(select c1, c2, rn, lead (rn) over (partition by c1 order by rn) rn1 from(select c1, c2, row_number () over (order by c2) rnfrom ttt))start with rn1 is nullconnect by rn1 =prior rngroup by c1;3、列数不固定(交叉表行列转置)这种是比较麻烦的一种,需要借助pl/sql:原始数据:CLASS1 CALLDATE CALLCOUNT1 2005-08-08 401 2005-08-07 62 2005-08-08 773 2005-08-09 333 2005-08-08 93 2005-08-07 21转置后:CALLDATE CallCount1 CallCount2 CallCount3------------ ---------- ---------- ----------2005-08-09 0 0 332005-08-08 40 77 92005-08-07 6 0 21试验如下:1). 建立测试表和数据CREATE TABLE t22(class1 VARCHAR2(2BYTE),calldate DATE,callcount INTEGER);INSERT INTO t22(class1, calldate, callcount)VALUES('1', TO_DATE ('08/08/2005','MM/DD/YYYY'),40); INSERT INTO t22(class1, calldate, callcount)VALUES('1', TO_DATE ('08/07/2005','MM/DD/YYYY'),6); INSERT INTO t22(class1, calldate, callcount)VALUES('2', TO_DATE ('08/08/2005','MM/DD/YYYY'),77); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/09/2005','MM/DD/YYYY'),33); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/08/2005','MM/DD/YYYY'),9); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/07/2005','MM/DD/YYYY'),21);COMMIT ;select calldate,nvl(max(case when class1 =1then callcount end),0)a1, nvl(max(case when class1 =2then callcount end),0) a2, nvl(max(case when class1 =3then callcount end),0)a3 from t22group by calldateorder by calldate desc;CALLDATE CallCount1 CallCount2 CallCount3------------ ---------- ---------- ----------2005-8-9 0 0 332005-8-8 40 77 92005-8-7 6 0 21。
oracle数据库case when的用法 -回复
oracle数据库case when的用法-回复"Oracle数据库CASE WHEN"的用法在Oracle数据库中,CASE WHEN是一种非常有用的条件表达式,用于根据特定的条件执行不同的操作。
它可以在查询中使用,也可以用于更新和插入操作。
本文将一步一步回答关于Oracle数据库中CASE WHEN的用法,并提供实际的示例来解释它的功能和用途。
一、CASE WHEN语法结构CASE WHEN语句通常有以下基本结构:CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE resultNEND在上述结构中,condition1、condition2等是一系列条件,result1、result2等是对应条件的结果。
如果没有任何条件满足,则返回ELSE子句中的结果。
CASE WHEN语句连续地测试每个条件,直到找到一个满足的条件,然后返回相应的结果。
条件可以是一个简单的比较表达式,也可以是复杂的逻辑表达式。
结果可以是常量、表达式、列名,或者是子查询。
CASE语句可以嵌套在其他CASE语句或其他逻辑结构中。
二、CASE WHEN在查询中的使用在查询中,CASE WHEN可以根据特定的条件返回不同的结果。
这在需要根据特定条件对查询结果进行分组或过滤时非常有用。
假设我们有一个名为"employees"的表,其中包含员工的姓名、部门和工资等信息。
现在我们想根据员工的工资级别进行分类,并计算每个工资级别下的员工数量。
我们可以使用以下查询来实现:SELECTCASEWHEN salary <= 5000 THEN '低'WHEN salary > 5000 AND salary <= 10000 THEN '中'ELSE '高'END AS salary_level,COUNT(*) AS countFROMemployeesGROUP BYCASEWHEN salary <= 5000 THEN '低'WHEN salary > 5000 AND salary <= 10000 THEN '中'ELSE '高'END;在上述查询中,我们使用了两次CASE WHEN语句。
oracle case when then nvl else用法
oracle case when then nvl else用法Oracle CASE WHEN THEN NVL ELSE在Oracle数据库中,CASE语句是一种用于实现条件判断的语法结构。
它可以根据特定的条件对数据进行分类或转换,非常灵活和实用。
在CASE语句中,可以使用WHEN、THEN、ELSE和END等关键字进行条件判断和处理。
以下是一些关于Oracle CASE WHEN THEN NVL ELSE语法的用法和详细解释:1. 基本语法CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE resultNEND在上述的语法中,CASE语句会根据不同的条件(condition)逐一进行判断,如果某个条件成立,则返回相应的结果(result)。
如果所有条件都不成立,则返回ELSE的结果。
2. 示例分类数据假设有一个学生成绩表,需要将成绩根据分数进行分类:优秀、良好、及格和不及格。
SELECTStudentName,CASEWHEN Score >= 90 THEN '优秀'WHEN Score >= 80 THEN '良好'WHEN Score >= 60 THEN '及格'ELSE '不及格'END AS GradeFROM Students;在上述示例中,根据不同的分数范围,使用多个WHEN子句对成绩进行分类,并返回相应的等级。
转换数据类型有时候,我们需要将某个字段的数据类型转换为不同的类型。
例如,将字符串类型的数字转换为数值类型。
SELECTEmployeeName,CASEWHEN ISNUMBER(EmployeeAge) = 1 THEN TO_NUMBER(EmployeeAge)ELSE NULLEND AS ConvertedAgeFROM Employees;在上述示例中,通过使用CASE语句和TO_NUMBER函数,将字符串类型的员工年龄转换为数值类型。
ORACLECASEWHEN及SELECTCASEWHEN的用法
ORACLECASEWHEN及SELECTCASEWHEN的⽤法Case具有两种格式。
简单Case函数和Case搜索函数。
--简单Case函数CASE sexWHEN '1' THEN '男'WHEN '2' THEN '⼥'ELSE '其他' END--Case搜索函数CASE WHEN sex = '1' THEN '男'WHEN sex = '2' THEN '⼥'ELSE '其他' END这两种⽅式,可以实现相同的功能。
简单Case函数的写法相对⽐较简洁,但是和Case搜索函数相⽐,功能⽅⾯会有些限制,⽐如写判断式。
还有⼀个需要注意的问题,Case函数只返回第⼀个符合条件的值,剩下的Case部分将会被⾃动忽略。
--⽐如说,下⾯这段SQL,你永远⽆法得到“第⼆类”这个结果CASE WHEN col_1 IN ( 'a', 'b') THEN '第⼀类'WHEN col_1 IN ('a') THEN '第⼆类'ELSE'其他' END下⾯我们来看⼀下,使⽤Case函数都能做些什么事情。
⼀,已知数据按照另外⼀种⽅式进⾏分组,分析。
有如下数据:(为了看得更清楚,我并没有使⽤国家代码,⽽是直接⽤国家名作为Primary Key)国家(country)⼈⼝(population)中国600美国100加拿⼤100英国200法国300⽇本250德国200墨西哥50印度250根据这个国家⼈⼝数据,统计亚洲和北美洲的⼈⼝数量。
应该得到下⾯这个结果。
洲⼈⼝亚洲1100北美洲250其他700想要解决这个问题,你会怎么做?⽣成⼀个带有洲Code的View,是⼀个解决⽅法,但是这样很难动态的改变统计的⽅式。
oracle when用法
oracle when用法标题:深入理解Oracle WHEN用法在Oracle数据库中,WHEN语句是一种条件控制语句,主要用于在SQL查询和PL/SQL块中实现逻辑判断。
它在多种场景下都有应用,如CASE表达式、DECODE函数、IF-THEN-ELSE语句等。
以下我们将一步一步解析Oracle WHEN的用法。
一、CASE表达式中的WHENCASE表达式是Oracle中最常用的条件判断语句之一,其基本语法如下:CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE result_nEND;在这个结构中,WHEN关键字后面跟着一个条件(condition),如果这个条件为真,那么就返回对应的result。
如果所有的WHEN条件都不满足,那么就会执行ELSE后面的语句。
例如,我们有一个员工表EMP,包含薪水字段SALARY,我们想根据薪水的不同范围给员工分类:sqlSELECTemployee_name,CASEWHEN salary <= 3000 THEN 'Low'WHEN salary <= 6000 THEN 'Medium'ELSE 'High'END AS salary_levelFROM emp;在这个查询中,WHEN语句用于判断薪水的范围,并返回相应的分类。
二、DECODE函数中的WHENDECODE函数是Oracle中的另一个条件判断函数,其基本语法如下:DECODE(expression, value1, result1, value2, result2, ...,default_result)在这个结构中,WHEN的用法与CASE表达式类似,只不过它是通过比较expression和value来决定返回哪个result。
例如,我们仍然使用上述的EMP表,但这次我们使用DECODE函数来进行分类:sqlSELECTemployee_name,DECODE(salary,<= 3000, 'Low',<= 6000, 'Medium','High') AS salary_levelFROM emp;在这个查询中,WHEN的用法体现在每个value和result的对应关系上。
sql自定义查询结果字段使用casewhen行列转换
sql⾃定义查询结果字段使⽤casewhen⾏列转换当查询结果没你想要的字段的时候,可以直接添加,字符串或者数值select XF_NSRMC,'count1' from t_fpgl_jdcfpxx 结果可以看到,添加字段 count1,会有字段显⽰ count1,且所有的值也为 count1,值不重要,⼀般⽤于组装数据,把真正需要的数据计算和填充到该字段下,然后返回前端可以很好的解析使⽤直接增加字段还可以⾏列转换功能,⾃⾏定义,让然后通过分组使⽤case when 转⾏普通分组 sqlselect fpzt,count(fpzt) count from t_fpgl_jdcfpxx GROUP BY fpzt发现统计是出来了,不过我想把0 1 4 放到列上边,如 0 1 4 3570 240 2 由于map接收数据,所以格式想要⾏列转换,这样前端⽅便解析。
改进:⾏列转换select case WHEN fpzt='0'then count(fpzt) else null end'0',case WHEN fpzt='1'then count(fpzt) else null end'1',case WHEN fpzt='3'then count(fpzt) else null end'3',case WHEN fpzt='4'then count(fpzt) else null end'4' ,count(fpzt) from t_fpgl_jdcfpxx GROUP BY fpzt可是发现单独占⼀⾏,不是想要的,使⽤case when 设置想要的字段,最后再次分组,求和select XF_NSRMC xfmc,sum(f0)zsfs,sum(f1)fsfs,sum(f3)zsfpfs,sum(f4)fsfpfs,bhsj,zzsse,jshj from (select case WHEN XF_NSRMC is not null then XF_NSRMC else null end'XF_NSRMC',case WHEN0=a.FPZT then (a.count) else0end'f0',case WHEN1=a.FPZT then (a.count) else0end'f1',case WHEN3=a.FPZT then (a.count) else0end'f3',case WHEN4=a.FPZT then (a.count) else0end'f4' ,bhsj,zzsse,JSHJfrom ( select DISTINCT0,1,3,4,XF_NSRMC ,fpzt,count(fpzt) count,sum(BHSJ) bhsj,sum(ZZSSE)zzsse,sum(jshj)jshj from t_fpgl_jdcfpxxwhere SSYF ='202109'GROUP BY XF_NSRMC,fpzt ) a) b GROUP BY XF_NSRMC结果图,。
T-SQL行列转换
T-SQL行列转换行列转换,通常有2种方法,一是CASE WHEN/UNION;一是PIVOT/UNPIVOT。
对于行值或列数不固定的情况,需要用动态SQL。
一. 行转列123456789101112131415161718--drop table RowToCol create table RowToCol(ID int,Code varchar(10), Value int)Goinsert RowToColselect 1,'Item1',1000 union all select 1,'Item2',1000 union all select 1,'Item3',500 union all select 2,'Item1',2000 union all select 2,'Item2',0 union all select 3,'Item1',1000 union all select 3,'Item3',500GOselect * from RowToCol要得到这样的结果:IDItem1Item2Item311000100050022000310005001. CASE WHEN在SQL Server 2000时,常用的写法,沿用至今。
(1) 静态1234567891011select ID,sum(case Code when 'Item1' then Value else 0 end) as Item1,sum(case Code when 'Item2' then Value else 0 end) as Item2,sum(case Code when 'Item3' then Value else 0 end) as Item3from RowToCol group by ID--或者用max也行select ID,max(case Code when 'Item1' then Value else 0 end) as Item1,max(case Code when 'Item2' then Value else 0 end) as Item2,max(case Code when 'Item3' then Value else 0 end) as Item3from RowToCol group by ID(2) 动态在不确定有多少行需要转为列时,先distinct出待转列的值,再拼出包含若干个CASE的SQL语句,然后运行。
oracle数据库中case when的用法
oracle数据库中case when的用法标题:深入了解Oracle数据库中CASE WHEN语句的用法引言:在Oracle数据库中,CASE WHEN语句是一种非常常用且强大的条件语句,用于在查询和数据操作中根据条件做出不同的选择。
本文将详细介绍Oracle数据库中CASE WHEN的用法,以帮助读者更好地使用和理解这一功能。
一、CASE WHEN语句的基本语法结构CASE WHEN语句通常由以下几个关键字组成:1. CASE:用于开始一个CASE WHEN语句。
2. WHEN:用于定义条件表达式。
3. THEN:用于定义满足条件时的表达式或值。
4. ELSE:可选关键字,用于定义没有条件满足时的表达式或值。
5. END:用于结束CASE WHEN语句。
CASE WHEN语句的基本语法结构如下:CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE result_defaultEND二、CASE WHEN语句的使用场景CASE WHEN语句可以用于各种查询和数据操作场景,例如:1. 根据条件动态选择查询字段。
2. 根据条件对查询结果进行分类和计算。
3. 根据条件在数据更新和插入过程中进行判断和处理。
4. 根据条件进行数据转换和重组。
三、CASE WHEN语句的详细应用示例为了更好地理解和掌握CASE WHEN语句的用法,以下将通过一些具体示例进行详细解释和演示。
示例1:根据员工年龄分类计算平均工资假设有一张员工表,包含了员工的姓名、年龄和工资等字段。
现在需要根据员工的年龄进行分类,并计算每个年龄段员工的平均工资。
SELECTCASEWHEN age < 30 THEN '30岁以下'WHEN age >= 30 AND age < 40 THEN '30-40岁'WHEN age >= 40 AND age < 50 THEN '40-50岁'ELSE '50岁以上'END AS age_group,AVG(salary) AS avg_salaryFROMemployeesGROUP BYCASEWHEN age < 30 THEN '30岁以下'WHEN age >= 30 AND age < 40 THEN '30-40岁'WHEN age >= 40 AND age < 50 THEN '40-50岁'ELSE '50岁以上'END;上述示例中,使用CASE WHEN语句根据员工年龄动态分类,然后对每个年龄段的员工进行平均工资计算。
