[英]How to read every row in SQL
我如何閱讀每一行以確定客戶是已全額付款還是部分付款或從未付款?
我希望代碼讀取每個客戶帳單的每一行,直到找到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
的金額,而對於累積貨幣333
,賬單直到第三個月才被支付了,僅部分支付了。 對於客戶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_DUE
和TOTAL_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
更改為表的實際名稱。 通過比較最后兩列,您可以確定客戶是否支付了總金額。
要對表的最后兩列求和,您可以執行以下操作:
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
存儲為字段。 至少不在同一個表中。 我認為您需要對“重復錄入簿記”進行一些研究可能也會有所幫助。
產生一個語句類型系統。
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
給您應invamt
如果只需要一個客戶的余額,則需要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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.