如何读取 SQL 中的每一行
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
,账单直到第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_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
为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
如何阅读每一行以确定客户是已全额付款、部分付款还是从未付款?
我希望代码读取每个客户账单的每一行,直到找到 TOTAL_PAYMENT_AMT = TOTAL_DUE
。如果找到,则将其标记为已付款,如果未找到,请阅读下一行,直到找到 TOTAL_PAYMENT_AMT <> 0
和 TOTAL_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_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
为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