我有一个与其自身进行比较的工作查询,以查找差异非零的行。这将删除数据库中具有相同 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代码不考虑总和。
我一直在研究的是一个返回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
让我们获取上面的代码,然后返回一个我们想要关注的RXID。这个payeroblig与amountpaid不同。这是该列中所有RXID的总和。这是一个问题,他们需要平衡,这会突出显示它们与此RXID不匹配
答案 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行。