Sql server 如何在SQL Server中获取累计和
我是新来的,我需要你们的帮助,我有一个包含发票列表的数据,我想检查每张发票是否已付款 这是我的数据:Sql server 如何在SQL Server中获取累计和,sql-server,Sql Server,我是新来的,我需要你们的帮助,我有一个包含发票列表的数据,我想检查每张发票是否已付款 这是我的数据: ID | JO | C. ID | L |Invoice |Amount |Payment 279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000 279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000 279814 | B1 | CL0001 | a | FA0003 | 76644 | 1
ID | JO | C. ID | L |Invoice |Amount |Payment
279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000
279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000
279814 | B1 | CL0001 | a | FA0003 | 76644 | 170000
279868 | B1 | CL0001 | a | FA0004 | 51500 | 170000
这就是我想要的结果:
ID | JO | C. ID | L |Invoice |Amount |Payment |Rest | State
279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000 | 0 | PAID
279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000 | 0 | PAID
279814 | B1 | CL0001 | a | FA0003 | 76644 | 170000 | 3002 | P. PAYMENT
279868 | B1 | CL0001 | a | FA0004 | 51500 | 170000 | 51500 | NOT PAID
ID | JO | C. ID | L |Invoice |Amount |Payment |Rest | State
279810 | B1 | CL0001 | a | FA0001 | 55638 | 50000 | 5638 | P. PAYMENT
279812 | B1 | CL0001 | a | FA0002 | 40720 | 50000 | 40720 | NOT PAID
先谢谢你
我还有另一种情况,即只有部分付款,如下面的示例所示:
ID | JO | C. ID | L |Invoice |Amount |Payment
279810 | B1 | CL0001 | a | FA0001 | 55638 | 50000
279812 | B1 | CL0001 | a | FA0002 | 40720 | 50000
我得到的结果是:
ID | JO | C. ID | L |Invoice |Amount |Payment |Rest | State
279810 | B1 | CL0001 | a | FA0001 | 55638 | 50000 | 55638 | NOT PAID
279812 | B1 | CL0001 | a | FA0002 | 40720 | 50000 | 40720 | NOT PAID
我想要的结果是:
ID | JO | C. ID | L |Invoice |Amount |Payment |Rest | State
279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000 | 0 | PAID
279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000 | 0 | PAID
279814 | B1 | CL0001 | a | FA0003 | 76644 | 170000 | 3002 | P. PAYMENT
279868 | B1 | CL0001 | a | FA0004 | 51500 | 170000 | 51500 | NOT PAID
ID | JO | C. ID | L |Invoice |Amount |Payment |Rest | State
279810 | B1 | CL0001 | a | FA0001 | 55638 | 50000 | 5638 | P. PAYMENT
279812 | B1 | CL0001 | a | FA0002 | 40720 | 50000 | 40720 | NOT PAID
要获取累计发票金额,请使用
sum(amount)over(order by ID)
。我假设它的顺序是ID
。您还需要按客户进行分区。我没有把它包括在查询中,因为我不确定它的列名是什么
其余的并不难理解。它使用CASE
语句来确定是否已支付或部分支付或未支付
select *,
Rest = case when Payment > sum(Amount) over (order by ID)
then 0
when sum(Amount) over (order by ID) - Payment < Amount
then sum(Amount) over (order by ID) - Payment
else Amount
end,
State = case when Payment > sum(Amount) over (order by ID)
then 'PAID'
when sum(Amount) over (order by ID) - Payment < Amount
then 'P. PAYMENT'
else 'NOT PAID'
end
选择*,
剩余=付款>总额(金额)超过时的情况(按ID排序)
然后0
当总额(金额)超过(订单ID)-付款<金额
然后在(按ID订购)上加总(金额)-付款
其他金额
完,,
状态=付款>总额(金额)超过时的情况(按ID排序)
然后“付费”
当总额(金额)超过(订单ID)-付款<金额
然后“付款”
否则“未付款”
结束
好吧,它对一个客户有效,但是如果我有多个客户,那么计算是错误的
这就是我得到的:
ID | JO |Customer| L |Invoice |Amount |Payment |Rest | State
-------+----+--------+---+--------+-------+--------+-------+-------------
279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000 | 0 | PAID
279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000 | 0 | PAID
279814 | B1 | CL0001 | a | FA0003 | 76644 | 170000 | 3002 | P. PAYMENT
279868 | B1 | CL0001 | a | FA0004 | 51500 | 170000 | 51500 | NOT PAID
279870 | B1 | CL0002 | a | FA0005 | 10000 | 60000 | 10000 | NOT PAID
279871 | B1 | CL0002 | a | FA0006 | 15000 | 60000 | 15000 | NOT PAID
279872 | B1 | CL0002 | a | FA0007 | 30000 | 60000 | 30000 | NOT PAID
279873 | B1 | CL0002 | a | FA0008 | 25000 | 60000 | 25000 | NOT PAID
这就是我应该得到的:
ID | JO |Customer| L |Invoice |Amount |Payment |Rest | State
-------+----+--------+---+--------+-------+--------+-------+-------------
279810 | B1 | CL0001 | a | FA0001 | 55638 | 170000 | 0 | PAID
279812 | B1 | CL0001 | a | FA0002 | 40720 | 170000 | 0 | PAID
279814 | B1 | CL0001 | a | FA0003 | 76644 | 170000 | 3002 | P. PAYMENT
279868 | B1 | CL0001 | a | FA0004 | 51500 | 170000 | 51500 | NOT PAID
279870 | B1 | CL0002 | a | FA0005 | 10000 | 60000 | 0 | PAID
279871 | B1 | CL0002 | a | FA0006 | 15000 | 60000 | 0 | PAID
279872 | B1 | CL0002 | a | FA0007 | 30000 | 60000 | 0 | PAID
279873 | B1 | CL0002 | a | FA0008 | 25000 | 60000 | 20000 | P. PAYMENT
这个问题很有意思,因为可能会有没有任何部分付款的情况,下面的查询应该满足您的要求:
CREATE TABLE #temp (ID INT,JO VARCHAR(10),CID VARCHAR(10),L VARCHAR(10), Invoice VARCHAR(10), Amount NUMERIC(10,2), Payment NUMERIC(10,2))
INSERT INTO #temp VALUES
(279810,'B1','CL0001','a','FA0001',55638,170000),
(279812,'B1','CL0001','a','FA0002',40720,170000),
(279814,'B1','CL0001','a','FA0003',73642,170000),
(279868,'B1','CL0001','a','FA0004',51500,170000),
(279868,'B1','CL0001','a','FA0004',200,170000),
(279868,'B1','CL0001','a','FA0004',1234678,170000),
(279868,'B1','CL0001','a','FA0004',90,170000),
(279870,'B1','CL0002','a','FA0005',10000,60000),
(279871,'B1','CL0002','a','FA0006',15000,60000),
(279872,'B1','CL0002','a','FA0007',30000,60000),
(279873,'B1','CL0002','a','FA0008',25000,60000),
(279810,'B1','CL0003','a','FA0001',55638,50000),
(279812,'B1','CL0003','a','FA0002',40720,50000)
SELECT ID,JO,CID,L,Invoice,Amount,Payment
,CASE WHEN t.[Balance] >=0 THEN 0
WHEN t.[Balance] <0 AND LAG(t.[Balance],1,1) OVER( PARTITION BY CID ORDER BY (SELECT 1)) > 0 THEN ABS(t.[Balance])
ELSE [Amount] END AS [Balance Amount]
,CASE WHEN t.[Balance] >=0 THEN 'Paid'
WHEN t.[Balance] <0 AND LAG(t.[Balance],1,1) OVER( PARTITION BY CID ORDER BY (SELECT 1)) > 0 THEN 'Partial Payment'
ELSE 'Not Paid' END AS [Status]
FROM (
SELECT *
,SUM(Amount) OVER (PARTITION BY CID ORDER BY (SELECT 1) ROWS UNBOUNDED PRECEDING ) Cumulative
FROM #temp ) A
CROSS APPLY (VALUES(Payment - Cumulative)) AS T(Balance)
最好以文本而不是图像的形式发布示例数据和所需结果。这里的列名是什么?什么是已付发票?@johncapelletti我做到了。谢谢。@hmzshl在我看来,您的数据中有7列,但您只提供了5列名称。缺少某些内容。请向我们显示您的SQL,该SQL不太适合您!那看起来很像我要找的。我会尝试一下,给你一个反馈。谢谢。感谢@Squirrel破译了真正需要的东西。我知道我不理解。现在有道理了。@Squirrel我试过了,它对一个客户有效,但对多个客户无效。。你能看看我下面的回答吗。谢谢。您将需要按划分
,正如我在回答中所说的那样,这个划分非常有效!!这就是我要找的。非常感谢您抽出时间,先生!!我有另一个案例,当只有一张发票和一部分付款时,查询返回“未付款”而不是“部分付款”@hmzshl请更新qn中的样本数据以包括此场景。请再次查看我的帖子,我用我的另一个案例编辑。非常感谢。