Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中获取累计和_Sql Server - Fatal编程技术网

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中的样本数据以包括此场景。请再次查看我的帖子,我用我的另一个案例编辑。非常感谢。