2016-05-29 59 views
1

我有一個表返回一些行,我們正在查看的僅僅是rxID匹配並且如果這些amountPaid與eachother相反。如何返回刪除與兩列匹配的SQL行的表

在屏幕截圖中,我們有兩個條目的rxID爲3350593,其支付金額爲2.35和-2.35。這是一種貨幣類型的格式。

我的查詢到目前爲止只返回那兩行enter image description here,因爲它在rxId上是匹配的。 y.amount在底部,無法找到,並且t.amountpaid不能被選中,同時也可以通過t.rxid進行分組。

如果我可以得到一個查詢來刪除這兩行具有相同的rxID和反轉數量的支付,我很感激。

SELECT x.* 
    FROM 
(
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 
) x 
JOIN (SELECT t.rxID 
     FROM 
     (
    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 
) t 

    GROUP BY t.rxID 
    HAVING COUNT(t.rxID) > 1) y ON y.rxID = x.rxid 

    --can't find y.amountpaid, x can be seen 
    --and y.amountPaid = x.amountPaid 

現在正在處理這個問題,但是x.amount付款是無效的,因爲它不是一個集合函數。

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 
    ); 

回答

1

您期待什麼結果?我簡化了查詢,看看這個:

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 
JOIN (
    SELECT t.rxID -- how you want to find amountpaid if you don't select this 
    --you can select max or min from amountpaid, to not group by this field 
    , min(amountpaid) min_amountpaid, max(amountpaid) max_amountpaid 
    FROM x t 
    GROUP BY t.rxID 
    HAVING COUNT(t.rxID) > 1) y 
ON y.rxID = x.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 1 FROM x t WHERE t.rxID = x.rxID and t.amountPaid = -1 * x.amountPaid) 
+0

我需要查詢以刪除兩行與RXID匹配且amountPaid爲2.35 = -2.35 ... GROUP BY t.rxID HAVING COUNT(t.rxID)> 1)y ON y.rxID!= x.rxid and y.amountpaid = x.amountpaid * - 1 – Jayizzle

+0

但y.amount只支付了Count(t.rxid),而t.amountpaid僅支持t.rxid。 – Jayizzle

+0

爲了澄清,如果y.rxid = x.rxid爲真,我們有兩個匹配,那麼amountPaid可以是0和1.這不相等,我們需要保持這一點。 – Jayizzle