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月份的那个表都有几千万的数据,我是一个小白,希望你们这些大神帮助我
游标的使用步骤:
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、列出每张表中的所有字段,以下面的格式列出:
表A----作用
字段A1----作用、说明
字段A2----作用、说明
另外你的要求2,是打算使用SQL发短信?
写的时候没有用游标,不知道是不是符合要求,可以参照一下。
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)