select e.empno,e.ename,-------------------
decode(e.deptno,'10','技术部','20','行政部','30','销售部','其他部门') 部门
from emp e,dept d
where e.deptno=d.deptno;
1.对员工的月薪进行判断横向展示各个部门收入范围的人数
--展示字段:部门编号、低保户、低收入、收入还可以
部门编号 低保户 低收入 收入还可以
10 3 1 2
20 4 6 8
30 1 5 1
按照部门来统计不同收入区间的员工的数量
select * from emp;
select deptno 部门编号,count(case WHEN SAL<1000 then deptno END) 低保户,
count(case WHEN SAL>=1000 AND SAL<=2000 then 1 END) 低收入,
count(case WHEN SAL>2000 then 1 END) 收入还可以 from emp group by deptno order by deptno asc;
此时,如果要判断工资,要求1000以下,为低收入;1000-2000,为中等收入;2000以上,为高收入
select empno,ename,sal,
case
when sal<1000 then '低收入'
when sal>=1000 and sal<2000 then '中等收入'
else '高收入'
end 工资状况
from emp;
-------------------------------------------------------------------------------------------
练习:从表1的数据中,通过sql查询得到表2的结果
--表1------------------------
Y Q AMT
2015 1 100
2015 2 110
2015 3 130
2015 4 100
2016 1 180
2016 2 170
2016 3 160
2016 4 130
---表2------------------------
Y Q1 Q2 Q3 Q4
2015 100 110 130 100
2016 180 170 160 130
--建表语句-----------------------------------------
CREATE TABLE TEST_TABLE(
Y NUMBER,
Q NUMBER,
AMT NUMBER
);
INSERT INTO TEST_TABLE VALUES(2015 , 1 , 100);
INSERT INTO TEST_TABLE VALUES(2015 , 2 , 110);
INSERT INTO TEST_TABLE VALUES(2015 , 3 , 130);
INSERT INTO TEST_TABLE VALUES(2015 , 4 , 100);
INSERT INTO TEST_TABLE VALUES(2016 , 1 , 180);
INSERT INTO TEST_TABLE VALUES(2016 , 2 , 170);
INSERT INTO TEST_TABLE VALUES(2016 , 3 , 160);
INSERT INTO TEST_TABLE VALUES(2016 , 4 , 130);
COMMIT;
select * from test_table;
select Y,
MAX(CASE WHEN Q=1 THEN AMT END) Q1,
MIN(CASE WHEN Q=2 THEN AMT END) Q2,
MIN(CASE WHEN Q=3 THEN AMT END) Q3,
AVG(CASE WHEN Q=4 THEN AMT END) Q4
from TEST_TABLE GROUP BY Y;
select Y,
MAX(DECODE(Q,1,AMT))Q1,
MAX(DECODE(Q,2,AMT))Q2,
MAX(DECODE(Q,3,AMT))Q3,
MAX(DECODE(Q,4,AMT))Q4
from TEST_TABLE GROUP BY Y;
--------------------------------------------------------------------------------------------------------------
1.判断输入的年份是否是闰年
提示(判断是否是闰年的条件):A:能被4整除,并且不能被100整除;B:或者能被400整除。
SET SERVEROUTPUT ON;
DECLARE
n NUMBER(8);
BEGIN
n :=&数字;
IF mod(n,4)=0 AND mod(n,100)<>0 THEN dbms_output.put_line(n||'是闰年');
ELSIF mod(n,400)=0 THEN dbms_output.put_line(n||'是闰年');
else dbms_output.put_line(n||'不是闰年');
END IF;
END;
--------------------------------------------------------------------------------
2.根据考试成绩,显示所获奖励
成绩==100分,爸爸给他买辆车
成绩>=90分,妈妈给他买MP4
90分>成绩>=60分,妈妈给他买本参考书
成绩<60分,什么都不买
DECLARE
n number(8);
BEGIN
n :=&数字;
IF n=100 THEN dbms_output.put_line('爸爸奖励一台车');
ELSIF n>=90 AND N<100 THEN dbms_output.put_line('妈妈奖励MP4');
ELSIF n>=60 AND N<90 THEN dbms_output.put_line('妈妈奖励本参考书');
ELSIF n<60 THEN dbms_output.put_line('什么都不买');
else dbms_output.put_line('error');
END IF;
END;
------------------------------------------------------------------------------------------
3.张三为他的手机设定了自动拨号
按1:拨爸爸的号
按2:拨妈妈的号
按3:拨爷爷的号
按4:拨奶奶的号
DECLARE
n number(8);
BEGIN
n :=&数字;
IF n=1 THEN dbms_output.put_line('拨爸爸的号');
ELSIF n=2 THEN dbms_output.put_line('拨妈妈的号');
ELSIF n=3 THEN dbms_output.put_line('拨爷爷的号');
ELSIF n=4 THEN dbms_output.put_line('拨奶奶的号');
else dbms_output.put_line('error');
END IF;
END;
----------------------------------------------------------------------------------------
4.会员购物时,根据积分的不同享受不同的折扣,计算会员购物时所获得折扣并在控制台打印折扣数
会员积分<2000 ,则9折
2000<=会员积分<4000 ,则8折
4000<=会员积分<8000 ,则7折
会员积分>=8000 ,则6折
DECLARE
n number(30);
BEGIN
n :=&数字;
IF n<2000 THEN dbms_output.put_line('9折');
ELSIF n>=2000 AND n<4000 THEN dbms_output.put_line('8折');
ELSIF n>=4000 AND n<8000 THEN dbms_output.put_line('7折');
ELSIF n>=8000 THEN dbms_output.put_line('6折');
else dbms_output.put_line('ERROR');
END IF;
END;
本文通过具体实例介绍了SQL在部门收入统计、表数据转换、条件判断等方面的使用技巧,包括使用CASE WHEN语句进行条件判断、利用DECODE函数进行部门名称转换、实现表数据的横向展示等。
591

被折叠的 条评论
为什么被折叠?



