近一个月以来,接口开发过程中,学习所得

刚接触接口的开发时,连怎么拼接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

目前能想到的就这些,后续在做添加

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值