刚接触接口的开发时,连怎么拼接JSON格式都模模糊糊,在公司的同事们的帮助下逐渐熟悉了如何去写一个接口与前端进行对接,在开发接口过程中遇到了许许多多的问题,业务上的,sql语句的实现等等,等等。下面我就主要记载一些在编写sql语句时候的学到的一些函数和知识。
1.建立视图(WITH)
当时遇到一个需求,需要将不同级别的人员同时显示在页面,所用的表一致,只是对应的type不相同罢了,通过学习请教,使用WITH建立视图就轻松解决了
WITH
V_XX1 AS
(
sql语句。。。
),
V_XX2 AS
(
sql语句。。。
),
...
V_XXX AS
(
sql语句。。。
)
SELECT
...
FROM
...
2.当前时间往前推6个月进行数据展示
一个柱状图的展示,需要展示6个月的数据(包含本月的),这里我就只给出主要的where时间条件
TO_CHAR(T.COU_TM,'YYYY-MM')
IN
(SELECT TO_CHAR(ADD_MONTHS(SYSDATE,1-LEVEL),'YYYY-MM') FROM DUAL CONNECT BY LEVEL <= N)
N代表的是月份,往前推几个月N就是几。
3.对于连续3个月排名都在后三名的标段进行告警提示
刚看到这里的时候一点头绪都没,在进行短暂的梳理之后,逐渐有了思路,主要思路就是,先进行月份的分组统计,比如,现在是6月份,取近三个月的数据,然后进行相同字段的一个统计,出现次数≥3次的就是我们需要的数据。
SELECT
*
FROM
(
select
b.BIDS_CODE,
count(*) CS
from
(select a.BIDS_CODE
FROM (
select
T.BIDS_CODE,
T.MQUA_RANK,
T.COU_TM,
dense_rank() over(partition by T.COU_TM,T.BIDS_CODE order by T.MQUA_RANK desc) PM
from (
SELECT
T.BIDS_CODE,
T.MQUA_RANK,
T.COU_TM
FROM ATT_MQUA_BIZ T
LEFT JOIN ATT_BIDS_BASE T1 ON T.BIDS_CODE=T1.BIDS_CODE
LEFT JOIN REL_BIDS_ENTE T2 ON T.BIDS_CODE=T2.BIDS_CODE
LEFT JOIN ATT_ENTE_BASE T3 ON T2.ENTE_CODE=T3.ENTE_CODE
WHERE
TO_CHAR(T.COU_TM,'YYYY-MM')
IN (SELECT TO_CHAR(ADD_MONTHS(SYSDATE,1-LEVEL),'YYYY-MM') FROM DUAL CONNECT BY LEVEL <= 3)
ORDER BY T.MQUA_RANK DESC
)T
) a
where a.PM<=3
) b
group by b.BIDS_CODE
) C
WHERE C.CS >=3
4.使用sql进行字段的拼接
开发接口时,有的json数据格式需要自己去拼接,当时需要的问题是 对排完序之后的字段进行拼接,具体:将第一条的数据的ID与第二条的数据ID进行拼接(以此类推)。这里需要使用到oralce中的分析函数lead(xx,xx) over (order by null) lag ,该函数具体的作用就是将第二行的数据,进行操作之后返回到第一天数据中
SELECT
C.A,
lead(C.A,1) over (order by null) lag
FROM
(
SELECT WORW_CODE AS A , substr(WORW_NAME,3,2) AS B FROM ATT_WORW_BASE
WHERE WORW_NAME IS NOT NULL
ORDER BY substr(WORW_NAME,3,2) ASC) C
这里查询出来的结果就是
id1 id2
id2 id3
id3 id4
这里还没有进行字段的拼接,拼接也相当简单,在oracle中使用 ‘xx’ || 'xx'这样的格式进行拼接。、
5.字段唯一
这里使用到的函数就是 DISTINCT 直接使用在select后面,不可换其他位置,也可用这样使用
select count(distinct xx) from table
6.分母为零如何处理
需要使用到 decode 函数,在做计算式,难免遇到数据库中无数据,做除法是如何不做处理将会报错,这时候就可以用到decode函数,具体使用方法就是
decode(xx,'a','b','c') :如果xx值为a,则返回b,否则返回 c 这里就可以满足除数为0的情况下不会报错了
这里额外加一个 NVL 函数
NVL(XX,'0')如何XX为null则返回0,否则返回xx的值。
ROUND() 函数在做运算时也比较常用
ROUND(XX,'2') xx的运算结果保留2位小数
7.case when then else end 函数
也是在sql开发中比较常用的一个函数,一般在表中有type类别的时候用,判断该数据属于那种类型
case
when type=1
then '男'
when type=2
then '女'
else '未知'
end
目前能想到的就这些,后续在做添加