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

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个回答

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

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

wbj19930828
躲不开的心痛 你要的在下面我截图了
一年多之前 回复

游标的使用步骤:
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

图片说明

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

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)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
运用存储过程和游标,帮我写一个查询的语句,最后输出结果,可以先不考虑笛卡尔积
2
关于oracle语句转换为mysql的语句 主要是rownum不会转换
5
mysql count 优化问题
0
mysql存储过程游标遍历表数据报错,1328 Incorrect number of FETCH variables
1
ORACLE 存储过程 关于游标循环从一个表COPY到另一个表插入问题
2
QCustomplot怎么实现游标?
2
python cx_Oracle 将sql使用游标执行编码问题
1
Python通过cx_Oracle调用过程,过程中的OUT游标怎么在Python中打开?怎么把游标中的列名提取出来?
1
indexeddb如何实现模糊查询
1
利用游标处理表数据问题求助
0
存储过程实现模糊查询 多条数据的
4
oracle用游标将A表的字段和B表3个字段匹配,匹配到就将B表的三个字段和A表的CODE字段输入到一张新表里面
0
sql创建存储过程的问题
2
python操作mysql怎么开启事务
0
存储过程循环修改表中字段的值
1
使用游标查询部门为10的员工,并为其增加1000元,我这里测试反馈数据不正确,麻烦请教感谢
0
如何为SQL存储过程的参数赋值为另一张表查询的结果集,让存储过程按照这个结果集依次执行所有结果集
2
sql使用游标插入数据 为什么出现死循环?
3
请问使用游标处理动态sql的时候出现长度超长的问题如何解决?
1
C#中选完combox的值,曲线上自动出现相关值的游标是如何实现的,各位大神帮忙想想要用到游标的什么事件