如何阅读每一行以确定客户是否已全额付款或部分付款或从未付款?
我希望代码能够读取每个客户账单的每一行,直到找到TOTAL_PAYMENT_AMT = TOTAL_DUE
。如果找到,则将其标记为已付款,如果未找到,请阅读下一行,直到找到TOTAL_PAYMENT_AMT <> 0
和TOTAL_PAYMENT_AMT < TOTAL_DUE
,然后将其标记为部分付款或TOTAL_PAYMENT_AMT > TOTAL_DUE
,然后标记已付款。
对于客户111
,通过阅读第一行,帐单已全额付清-13129.54
。但对于客户222
,该帐单直到第二个月才支付-18768.9
金额,而对于cumster 333
,该帐单直到第3个月才会支付,并且仅支付部分。对于客户444
,该帐单从未支付过。(负#表示付费,正#表示已收费)
CUSTOMER_ID BILL_DATE TOTAL_DUE TOTAL_PAYMENT_AMT
111 3/19/2015 13129.54 -13129.54
111 4/20/2015 0 0
222 3/25/2015 26334.12 0
222 4/24/2015 -27000.00
333 2/25/2015 12720.21 0
333 3/25/2015 -1000.00
333 4/24/2015 -1071.15
444 2/26/2015 12266.6 0
444 3/26/2015 0
答案 0 :(得分:1)
这将为每个TOTAL_DUE
的{{1}}和TOTAL_PAYMENT_AMT
求和。
CUSTOMER_ID
更改SELECT CUSTOMER_ID,
MIN(BILL_DATE) AS [FIRST_BILL],
MAX(BILL_DATE) AS [LAST_BILL],
SUM(TOTAL_DUE),
SUM(TOTAL_PAYMENT_AMT)
FROM TABLE_NAME
GROUP BY CUSTOMER_ID
以获取表格的实际名称。您可以通过比较最后两列来确定客户是否支付了总金额。
要对表格中的最后两列求和,您可以这样做:
TABLE_NAME
然后你会得到一笔尚未支付的金额。
如果您只想汇总一行,请忘记SELECT CUSTOMER_ID,
MIN(BILL_DATE) AS [FIRST_BILL],
MAX(BILL_DATE) AS [LAST_BILL],
SUM(TOTAL_DUE + TOTAL_PAYMENT_AMT) AS [AMOUNT_DUE]
FROM TABLE_NAME
GROUP BY CUSTOMER_ID
,然后执行:
group by
答案 1 :(得分:0)
我不会将TOTAL_PAYMENT_AMT
存储为字段。至少不在同一张桌子里。
我认为你需要做一些关于“复式簿记”的研究也可能有所帮助。
制作声明类型系统。
CUSTOMER_ID BILL_DATE INV_AMT
111 3/19/2015 13129.54
select CUSTOMER_ID, BILL_DATE, SUM(INV_AMT) AS invamt
from TABLE_NAME
group by CUSTOMER_ID
如果“声明”直到某个时期,比如说是月份的第1个月。然后添加WHERE BILL_DATE < 07-01-2015
或者你希望的任何日期。
修改强>
在用@bmpasini评论后想出来我应该做一些修正。
invamt
会根据给定的CUSTOMER_ID
如果只想要一个客户的余额,那么您需要WHERE CUSTOMER_ID < 07-01-2015 AND CUSTOMER_ID = ?
编辑2
评论@angelcake。如果你不知道你在做什么,那么SQL中的算术是奇怪的。
所以最好的选择是将所有数字存储为整数。整数。然后除以100以返回2位小数。
int INV_AMT = 13129.54 * 100;
echo INV_AMT (1312954 / 100);
如果这没有意义,我会添加更多例子。
答案 2 :(得分:0)
这似乎是一个Windowed Aggregate Function的任务,一个运行总计?
SELECT CUSTOMER_ID, BILL_DATE, TOTAL_DUE, TOTAL_PAYMENT_AMT,
SUM(TOTAL_DUE)
OVER (PARTITION BY CUSTOMER_ID
ORDER BY BILL_DATE
ROWS UNBOUNDED PRECEDING) AS due,
SUM(TOTAL_PAYMENT_AMT)
OVER (PARTITION BY CUSTOMER_ID
ORDER BY BILL_DATE
ROWS UNBOUNDED PRECEDING) AS pay,
CASE
WHEN due + pay <= 0 THEN 'paid'
WHEN pay = 0 THEN 'not paid'
ELSE 'partially paid'
END
FROM tab