如何读取 SQL 中的每一行

How to read every row in SQL

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

我希望代码读取每个客户账单的每一行,直到找到 TOTAL_PAYMENT_AMT = TOTAL_DUE。如果找到,则将其标记为已付款,如果未找到,请阅读下一行,直到找到 TOTAL_PAYMENT_AMT <> 0TOTAL_PAYMENT_AMT < TOTAL_DUE 然后将其标记为已部分付款,或者如果 TOTAL_PAYMENT_AMT > TOTAL_DUE,则将其标记已付款。

对于客户 111,从阅读第一行开始,账单已全额支付 -13129.54。但是对于客户222,账单直到第2个月才支付-18768.9的金额,而对于cumster333,账单直到第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            

这将为每个 CUSTOMER_ID 求和 TOTAL_DUETOTAL_PAYMENT_AMT

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为table的实际名称。您将能够通过比较最后两列来确定客户是否支付了总金额。

要对 table 的最后两列求和,您可以这样做:

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 并简单地执行:

SELECT CUSTOMER_ID, 
       BILL_DATE, 
       (TOTAL_DUE + TOTAL_PAYMENT_AMT) AS [AMOUNT_DUE]
FROM TABLE_NAME

我不会将 TOTAL_PAYMENT_AMT 存储为字段。至少不在同一个table。 我认为您需要对 "double entry book keeping" 做一些研究可能也会有所帮助。

生成语句类型系统。

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

如果 "statement" 持续到某个时间段,比如该月的 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);

如果这没有意义,请发表评论,我会添加更多示例。

这似乎是一个窗口聚合函数的任务,总共 运行?

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