日终批处理中使用的sql

来源:互联网 发布:undefined index php 编辑:程序博客网 时间:2024/06/06 05:34
卡帐户处理部分:
WITH t AS ( SELECT w.kh,w.jyrq,w.jyje,w.jylx,w.csdm,w.kjyjsq,c.zjjyrq zjjyrq,c.KJYJSQ cur FROM BEPS_WASTEBOOK1 w LEFT JOIN BEPS_CARDACCT c ON w.kh=c.kh where csdm='2153' )
SELECT rq.KH,rq.latestTradeDate,coalesce(xf.consumeSum,0) consumeSum,coalesce(xf.consumeCount,0) consumeCount,coalesce(cz.chargeSum,0) chargeSum,coalesce(cz.chargeCount,0) chargeCount,jsq.jsq ,coalesce(zx.zxje,0) zxje
FROM
(SELECT T.KH, case when MAX(T.JYRQ)>max(zjjyrq) then max(T.JYRQ) else max(zjjyrq) end AS latestTradeDate FROM T GROUP BY KH) rq 
LEFT JOIN
(SELECT KH, SUM(JYJE)*100 AS consumeSum ,COUNT(jylx) AS consumeCount FROM t B2 WHERE JYLX='06' AND CSDM='2153' GROUP BY KH) xf 
ON rq.kh=xf.kh
LEFT JOIN
(SELECT KH, SUM(JYJE)*100 AS chargeSum ,COUNT(jylx) AS chargeCount FROM t  WHERE JYLX='02' AND CSDM='2153' GROUP BY KH) cz 
ON rq.kh=cz.kh
LEFT JOIN
(SELECT kh,CASE WHEN kjyjsq>cur THEN kjyjsq ELSE cur END jsq FROM ( SELECT t1.kh,max,min,remax ,cur,CASE WHEN cur-min>6500 THEN remax ELSE max END kjyjsq FROM (    SELECT kh ,max(kjyjsq) max,min(kjyjsq) min,min(cur) cur FROM t GROUP BY kh    ) AS t1 LEFT JOIN (    SELECT kh,max(kjyjsq) remax FROM t WHERE t.kjyjsq <t.cur GROUP BY kh ) AS t2 ON t1.kh=t2.kh) AS r) jsq
ON rq.kh=jsq.kh
LEFT JOIN
(SELECT KH,SUM(JYJE)*100 ZXJE FROM t WHERE JYLX='98' GROUP BY KH) AS ZX 
ON RQ.KH = ZX.KH
知识点:
1. 使用with语句。
2. 使用case语句。
3. 使用left连接。
  最近交易日期,消费,充值,卡交易计数器,注销。
4. 卡交易计数器的计算
  记录该卡当前最大的交易序号,包括充值、消费、缴费等

日终批处理时从交易流水帐中取最大号和本值做比较,如果大于本表中的值,用最大号替换本表的值,否则,不做处理

需注意的是,卡片中的卡交易计数器的存储范围是0~65535,当大于65535时卡片中的值会自动清零,重新开始计数,因此,如本表中的值和流水帐中的最小值的差额大于65000时,可认为卡片已重新计数,那么需用重新计数后的最大值替换本表的值

举例:本表的值为65534,流水帐中包含65535、1、2、3四条交易数据,65534 — 1 = 65531,因为65533 大于65000,我们认为卡片已经重新计数,为本表赋值重新计数后的最大值:3。