从一个列值的两个比较列sum()聚合返回SQL表

时间:2016-06-06 18:15:12

标签: sql sql-server sql-server-2008 join aggregate-functions

我有一个与其自身进行比较的工作查询,以查找差异非零的行。这将删除数据库中具有相同 rxid 的条目,并且它们的差异(付费 - 义务)是 x -x

我认为我需要使用的是一个聚合函数,因为我目前所拥有的不会删除多个条目,如果有两个以上的相同ID但具有平衡差异(例如三个差异为:x, - x / 2,-x / 2)。

我已经尝试使用sum()来获取每个rxid的整个列的总数但是我没有成功返回该行,因为我返回的'不是聚合函数的一部分'。我被告知要使用游标,但我觉得这是关系数据库中不可或缺的一部分,我在这里缺少一些东西。

WITH x
AS (
    SELECT IsInstyRxFlag
        ,pri.payerReceiptItemId
        ,CONVERT(VARCHAR, rx.oeDate, 101) rxOeDate
        ,CONVERT(DECIMAL(6, 2), drx.payerOblig) payerObligation
        ,CONVERT(DECIMAL(6, 2), pri.amountPaid) amountPaid
        ,pri.rxId
        ,CONVERT(DECIMAL(6, 2), (pri.amountPaid - drx.payerOblig)) difference
        ,rxeventid
    FROM PayerReceiptItem pri
    JOIN Rx ON rx.rxId = pri.rxId
    JOIN DispenseRx drx ON rx.rxId = drx.rxId
    WHERE CONVERT(DECIMAL(6, 2), drx.payerOblig) <> CONVERT(DECIMAL(6, 2), pri.amountPaid)
        AND payerReceiptID = 19781
    )
SELECT x.*
FROM x
WHERE NOT EXISTS (
        SELECT *
        FROM x AS y
        WHERE x.amountpaid = - 1 * y.amountpaid
            AND x.difference = x.amountpaid
            AND x.rxid = y.rxid
        );

在这张图片中,我们看到有两个相似的RXIDS为45.00。有一个90和另一个-90已被删除此外,但我的SQL代码不考虑总和。 reversal img

我一直在研究的是一个返回RXID及其义和金额的总和的查询。我坚持使用存在或某些东西检查payeroblig&lt;&gt;的区域amountpaid。

 select pri.RxID, (select SUM(drx.PAYEROBLIG)  from Dispenserx drx where   drx.RxID = pri.RxID) as payeroblig, (select SUM(pri1.AmountPaid)  from    PayerReceiptItem pri1 where pri1.RxID = pri.RxID and pri1.PayerReceiptID =   19781) as amountpaid  from PayerReceipt pr 
 join PayerReceiptItem pri on pri.PayerReceiptID = pr.PayerReceiptID
 JOIN DispenseRx drx ON pri.rxId = drx.rxId    
 where pr.PayerReceiptID=19781

pic 2

让我们获取上面的代码,然后返回一个我们想要关注的RXID。这个payeroblig与amountpaid不同。这是该列中所有RXID的总和。这是一个问题,他们需要平衡,这会突出显示它们与此RXID不匹配 enter image description here

2 个答案:

答案 0 :(得分:1)

如果你想要返回差异总和 amountPaid之和不同的所有行,我想这应该可以解决问题(未经测试) :

WITH x
AS (
    SELECT IsInstyRxFlag
        ,pri.payerReceiptItemId
        ,CONVERT(VARCHAR, rx.oeDate, 101) rxOeDate
        ,CONVERT(DECIMAL(6, 2), drx.payerOblig) payerObligation
        ,CONVERT(DECIMAL(6, 2), pri.amountPaid) amountPaid
        ,pri.rxId
        ,CONVERT(DECIMAL(6, 2), (pri.amountPaid - drx.payerOblig)) difference
        ,rxeventid
    FROM PayerReceiptItem pri
    JOIN Rx ON rx.rxId = pri.rxId
    JOIN DispenseRx drx ON rx.rxId = drx.rxId
    WHERE CONVERT(DECIMAL(6, 2), drx.payerOblig) <> CONVERT(DECIMAL(6, 2), pri.amountPaid)
        AND payerReceiptID = 19781
    )
SELECT x.*
FROM x
WHERE EXISTS (
        SELECT *
        FROM x AS y
        WHERE y.rxId = x.rxId
        GROUP BY y.rxId
        HAVING SUM(y.amountpaid) <> SUM(y.difference)  
);

答案 1 :(得分:0)

我想这个帖子的答案是:

 select distinct rxid, * from (select pri.RxID, (select SUM(drx.PAYEROBLIG)  from Dispenserx drx where drx.RxID = pri.RxID) as Sumpayeroblig, (select SUM(pri1.AmountPaid)  from PayerReceiptItem pri1 where pri1.RxID = pri.RxID and pri1.PayerReceiptID = 19781) as Sumamountpaid  from PayerReceipt pr 
  join PayerReceiptItem pri on pri.PayerReceiptID = pr.PayerReceiptID
 JOIN DispenseRx drx ON pri.rxId = drx.rxId 
 where pr.PayerReceiptID=19781) x 

 where x.Sumamountpaid <> x.Sumpayeroblig

这将获取两个表的总和,然后使用列名再次检查自身。这将返回9行。