wbj19930828
躲不开的心痛
2018-07-24 07:45
采纳率: 40%
浏览 523
已采纳

运用存储过程和游标,帮我写一个查询的语句,最后输出结果,可以先不考虑笛卡尔积

Comm.serv:用户表
正常在用用户:state = 2HA
CDMA用户:product_id = 379
Serv_id:用户编码 acct_nbr:用户号码

Comm.serv_acct:账户用户关联关系表
有效数据 state='10A'
Acct_id:账户编码

Comm.acct:账户表
Acct_name:账户名称

Acct.acct_balance:余额表
Balance:余额

Acct.ACCT_ITEM_201805:5月费用表
Amount:费用
Acct.ACCT_ITEM_201806:6月费用表
Amount:费用

Bill.acct_item_aggr_11807:实时费用表(在billdb)
Charge 实时费用

Acct.acct_credit:信用度表
Credit_amount:信用度值

Sms_info:短信发送表
Id:唯一值,消息ID
Msisdn:电话号码
FLAG:SEND
MSG:短信内容
Get_date:短信发送时间
Send_date = get_date
其他字段填空

欠费=余额-4、5月份话费-实时话费-信用度

要求:
1、统计出来所有用户欠费金额,统计信息包括:账户名称 ,账户ID,用户ID,余额、4月份话费、5月份话费、实时话费、信用度、欠费金额
2、对于欠费的用户,发送短信。短信内容:“xxx您好,截止到yyyy-mm-dd hh24:mi:ss,您已经欠费xx元,请您及时缴费! ”图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • a578154454
    csdn_87 2018-07-25 07:03
    已采纳

    这不是一个普通的查询吗?
    短信 就是把欠费 小于0的插入到短信表里面

    select c.acct_name,c.acct_id,a.servd_id,d.balance,e.amount_5,f.amount_6,g.charge,h.credit_amount,
    d.balance - nvl(e.amount_5,0) - nvl(f.amount_6,0) - g.charge - h.credit_amount as Arrears
    from serv a
    join serv_acct b on (a.servd_id = b.servd_id and b.state = '10A')
    join acct c on (b.acct_id = c.acct_id)
    join balance d on (d.acct_id = b.acct_id)
    left join (select serv_id,sum(amount) as amount_5 from acct_item_201805 group by serv_id) e
    on (a.servd_id = e.servd_id)
    left join (select serv_id,sum(amount) as amount_6 from acct_item_201806 group by serv_id) f
    on (a.servd_id = f.servd_id)
    left join (select serv_id,sum(charge) as charge from acct_item_aggr_11807@bill_228 group by serv_id) g
    on (a.servd_id = g.servd_id)
    left join acct_credit h on (h.acct_id = b.acct_id)
    where a.state = '2HA'
    and a.product_id = '379';

    点赞 评论
  • a578154454
    csdn_87 2018-07-26 08:04

    数据量大了 就是会慢啊 为什么要用游标?游标不更慢了

    SQL中一个查询能出来的活 肯定这样写执行快啊 除非SQL复杂了执行计划不正确
    看下执行计划 优化
    用存储过程就是把这段SQL拆分,用临时表存储中间结果数据。

    点赞 评论

相关推荐