簡體   English   中英

如何讀取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 ,賬單直到第二個月才支付了-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_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更改為表的實際名稱。 通過比較最后兩列,您可以確定客戶是否支付了總金額。

要對表的最后兩列求和,您可以執行以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM