2015-01-14 37 views
1

我有两个表 - 检查和策略。下面是结构。为了清楚起见,这是最起码的结构两列SQL DIfference

表名:检查

列: ChequeId。 ChequeNumber, 金额, LASTUPDATED

表名:政策

策略ID, PolicyNumber, ChequeId, 金额, LASTUPDATED

我想有一个查询返回给我下面的

ChequeNumber,PolicyId,ChequeAmount,PolicyAmount,Difference 

一张支票可以被映射到多个策略(一对多的关系) 现在,如果支票被匹配到说2个政策和这两个策略的量的总和大于支票金额越大,我应该看到其中的差别,但只适用于第二policy.It的假设,第一政策得到完全匹配的。(或许用最后更新列?)所以输出将

ChequeNumber PolicyNumber ChequeAmount PolicyAmount Difference  
    1    1    200   100   0 
    1    2    200   200   100 

下面是我自己编写

SELECT chequeNumber AS chequeNumber 
     ,COALESCE(p.policyNumber, '') AS PolicyNumber 
     ,c.amount AS chequeamount 
     ,p.Amount As PolicyAmount 
     ,(c.Amount) - SUM(p.Amount) OVER (PARTITION BY c.ChequeID) AS Difference 
FROM Cheque c 
LEFT JOIN Policy AS p 
    ON p.ChequeId=c.ChequeId 
GROUP BY chequeNumber, policyNumber,c.amount,p.Amount,c.ChequeID 

这给了我在两个行(下表)中的差异,而不仅仅是映射的最后一个策略。

ChequeNumber PolicyNumber ChequeAmount PolicyAmount Difference  
    1    1    200   100   -100 
    1    2    200   200   -100 

我正在使用SQL 2008 R2。

+2

[这](http://stackoverflow.com/questions/9420173/sql-subtracting-a-depleting -valu电子行业)这个问题涉及消耗库存中多个批次的库存。听起来像是一个类似的问题。 – HABO

回答

0

由于您使用的是SQL Server 2008中,你已经限制了窗函数的支持,所以你需要一个自联接:

WITH DATA AS 
(
    SELECT chequeNumber AS chequeNumber 
      ,COALESCE(p.policyNumber, '') AS PolicyNumber 
      ,c.amount AS chequeamount 
      ,p.Amount As PolicyAmount 
      ,P.MovingSum 
    FROM Cheque c 
    LEFT JOIN (SELECT P1.PolicyId 
         ,P1.PolicyNumber 
         ,P1.ChequeId 
         ,P1.Amount 
         ,P1.Amount + COALESCE(P2.Amount, 0) AS MovingSum 
       FROM Policy AS P1 
       LEFT JOIN Policy AS P2 
        ON P1.ChequeId = P2.ChequeId 
        AND P1.PolicyId > P2.PolicyId 
        AND P1.PolicyNumber > P2.PolicyNumber) AS p 
     ON p.ChequeId = c.ChequeId 
    GROUP BY chequeNumber, policyNumber, c.amount, p.Amount, c.ChequeID, p.MovingSum 
) 
SELECT chequeNumber 
     ,PolicyNumber 
     ,chequeamount 
     ,PolicyAmount 
     ,CASE WHEN MovingSum > PolicyAmount THEN MovingSum - chequeamount ELSE 0 END AS Difference 
FROM DATA; 
+0

谢谢,但它仍然给我相同的输出,虽然现在差异是积极的 –

+0

@RuchinMunjal它解决了你的问题? – dario

0

如果我理解正确的,你需要计算 政策金额之间的差额 - (检查量 - 考虑到分配已分配给以前的政策量) 是policynumber为了这应该工作:

SELECT chequeNumber AS chequeNumber 
     ,COALESCE(p.policyNumber, '') AS PolicyNumber 
     ,c.amount AS chequeamount 
     ,p.Amount As PolicyAmount 
     ,p.amount - 
     CASE WHEN 
     (c.Amount - (SELECT SUM(p1.amount) FROM cheque c1 LEFT JOIN policy p1 ON p1.chequeid=c1.chequeid AND p1.policynumber < p.policynumber)) < 0 THEN 0 
     ELSE (c.Amount - (SELECT SUM(p1.amount) FROM cheque c1 LEFT JOIN policy p1 ON p1.chequeid=c1.chequeid AND p1.policynumber < p.policynumber)) END Difference 
FROM Cheque c 
LEFT JOIN Policy AS p 
    ON p.ChequeId=c.ChequeId 
GROUP BY chequeNumber, policyNumber,c.amount,p.Amount,c.ChequeID