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

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

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元,请您及时缴费! ”

select a.serv_id, --用户id
c.acct_name, --账户名称
c.acct_id, --账户id

d.balance --余额
e.amount, --四月话费
f.amount, --五月话费
g.charge, --实时费用
h.credit_amount --信用度
(d.Balance - e.amount - f.amount - g.charge - h.credit_amount) as Arrearage --欠费金额
from Comm.serv a, --用户表
Comm.serv_acct b, --账户用户关联关系表
Comm.acct c, --账户表
Acct.acct_balance d, --余额表
(select serv_id, sum(amount) amount from acct.ACCT_ITEM_201805 group by serv_id) e, --五月话费
(select serv_id, sum(amount) amount from acct.ACCT_ITEM_201806 group by serv_id) f, --六月话费
bill.acct_item_aggr_11807@bill_228 g,--实时费用
acct.acct_credit h --信用度表
where a.state = '2HA'
and a.product_id = '379'
and a.serv_id = b.serv_id
and b.state = '10A'
and a.serv_id = b.serv_id
and b.acct_id = c.acct_id
and c.acct_id = d.acct_id
and a.serv_id = e.serv_id
and a.serv_id = f.serv_id
and a.serv_id = g.serv_id这个是我原来写的,会产生笛卡尔积,实时话费也需要加起来
还有一点,除了6月份的那个表都有几千万的数据,我是一个小白,希望你们这些大神帮助我

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

4条回答 默认 最新

  • idsuf698987
    609127400 2018-07-24 07:08
    已采纳

    游标的使用步骤:
    1.声明一个游标
    如:
    EXEC SQL DECLARE CSOR CURSOR FOR SELECT ENAME, JOB, SAL FROM EMP WHERE DEPTNO=:DEPTNO;
    声明了一个叫CSOR的游标,该游标从EMP表中读取ENAME,JOB,SAL字段
    2.打开一个游标
    如:
    EXEC SQL OPEN CSOR
    3.依次从游标中获取每一条数据(一般在一个循环中)
    如:
    while(条件){
    //每次取出一条数据放到变量中
    EXEC FETCH CSOR INTO 变量名
    //使用数据
    }

    4.使用后关闭游标
    EXEC SQL CLOSE CSOR

    点赞 评论
  • wxl847466025
    冬瓜就是我 2018-07-24 03:49

    感觉提问写的太凌乱了,看不太明白具体的意思。我有兴趣回答一下,但是希望提问能作如下修改:
    1、列出每张表中的所有字段,以下面的格式列出:
    表A----作用
    字段A1----作用、说明
    字段A2----作用、说明

    另外你的要求2,是打算使用SQL发短信?

    点赞 评论
  • wbj19930828
    躲不开的心痛 2018-07-24 07:41

    图片说明

    点赞 评论
  • wxl847466025
    冬瓜就是我 2018-07-26 08:40

    写的时候没有用游标,不知道是不是符合要求,可以参照一下。

    1、构建用户话费欠费余额表
    SELECT serv.servd_id AS 用户ID,acct.acct_id AS 账户ID,acct.acct_name AS 账户名称
    ,bala.balance AS 账户余额,Amount5 AS 五月话费,Amount6 AS 六月话费
    ,lastAmount AS 实时话费,cred.credit_amount AS 授信额度,(A.balance+cred.credit_amount-A.Amount6-A.Amount5-A.lastAmount) AS 欠费金额
    FROM (
    SELECT serv.servd_id,acct.acct_id,acct.acct_name,bala.balance,ISNULL(item5.Amount,0) AS Amount5,ISNULL(item6.Amount,0) AS Amount6,ISNULL(SUM(aggr.charge),0) AS lastAmount,cred.credit_amount
    FROM acct --账户表
    INNER JOIN serv ON serv.servd_id=acct.servd_id
    INNER JOIN balance bala ON bala.acct_id=acct.acct_id
    LEFT JOIN ACCT_ITEM_201805 item5 ON item5.serv_id=acct.servd_id
    LEFT JOIN ACCT_ITEM_201806 item6 ON item6.serv_id=acct.servd_id
    LEFT JOIN acct_item_aggr aggr ON aggr.serv_id=serv.servd_id
    LEFT JOIN acct_credit cred ON cred.serv_id=acct.servd_id
    GROUP BY serv.servd_id,acct.acct_id,acct.acct_name,bala.balance,item5.Amount,item6.Amount,cred.credit_amount
    ) AS A
    WHERE (A.balance+cred.credit_amount)<(A.Amount6+A.Amount5+A.lastAmount)----如需要包括不欠费的用户,此行可去掉

    2、发送短信
    INSERT INTO sms_info(id,msisdn,flag,msg,get_date,send_date)
    SELECT NEWID(),
    acc_nbr,
    'SEND',
    acct_name+'您好,截止到'+CONVERT(VARCHAR(19),GETDATE(),120)+'您已经欠费'+CONVERT(VARCHAR(20),(A.balance+cred.credit_amount-A.Amount6-A.Amount5-A.lastAmount))+'元,请您及时缴费!',
    GETDATE(),
    GETDATE()
    FROM (
    SELECT serv.servd_id,serv.acc_nbr,acct.acct_id,acct.acct_name,bala.balance,ISNULL(item5.Amount,0) AS Amount5,ISNULL(item6.Amount,0) AS Amount6,ISNULL(SUM(cred.charge),0) AS lastAmount,cred.credit_amount
    FROM acct --账户表
    INNER JOIN serv ON serv.servd_id=acct.servd_id
    INNER JOIN balance bala ON bala.acct_id=acct.acct_id
    LEFT JOIN ACCT_ITEM_201805 item5 ON item5.serv_id=acct.servd_id
    LEFT JOIN ACCT_ITEM_201806 item6 ON item6.serv_id=acct.servd_id
    LEFT JOIN acct_item_aggr aggr ON aggr.serv_id=serv.servd_id
    LEFT JOIN acct_credit cred ON cred.serv_id=acct.servd_id
    GROUP BY serv.servd_id,acct.acct_id,acct.acct_name,item5.Amount,item6.Amount) AS A
    WHERE (A.balance+cred.credit_amount)<(A.Amount6+A.Amount5+A.lastAmount)

    点赞 评论

相关推荐