如何读取SQL中的每一行

时间:2015-05-13 15:11:09

标签: sql teradata

如何阅读每一行以确定客户是否已全额付款或部分付款或从未付款?

我希望代码能够读取每个客户账单的每一行,直到找到TOTAL_PAYMENT_AMT = TOTAL_DUE。如果找到,则将其标记为已付款,如果未找到,请阅读下一行,直到找到TOTAL_PAYMENT_AMT <> 0TOTAL_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            

3 个答案:

答案 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