SQL 服务器:select 条支付 ID 相同但支付类型不同的记录

SQL Server: select records with same payment id, but different payment type

我只需要 select 具有相同付款 ID 但不同付款类型的记录。 在下面的输出示例中,第 1 行和第 2 行具有相同的付款 ID 和相同的付款类型。 我需要排除那些,只有 return 行,例如 3、4 和 5。

transID     transType   createdDate             paymentAmount_rtp   paymentAmount_tenders   DesiredResult   paymentDate             payment_Id  batchId TenderType  PaymentType
40064259    Payment     2019-12-16 09:07:16.160 286.30              -13.70                  0               2019-12-17 00:00:00.000 1072405     127737  2           CASH      
40064259    Payment     2019-12-16 09:07:16.160 286.30              300.00                  0               2019-12-17 00:00:00.000 1072405     127737  2           CASH      
40064261    Payment     2019-12-16 12:43:10.700 3958.91             -41.09                  0               2019-12-17 00:00:00.000 1072667     127737  2           CASH      
40064261    Payment     2019-12-16 12:43:10.700 3958.91             1600.00                 0               2019-12-17 00:00:00.000 1072667     127737  2           CASH      
40064261    Payment     2019-12-16 12:43:10.700 3958.91             2400.00                 0               2019-12-17 00:00:00.000 1072667     127737  1           CHECK     

这是我正在使用的查询,它可能不是写得最好的查询。非常感谢任何帮助:

SELECT 
    transID
,   transType
,   createdDate
,   paymentAmount_rtp
,   paymentAmount_tenders
,   DesiredResult
,   paymentDate
,   payment_Id
,   batchId
,   TenderType
,   PaymentType 
FROM
(
    SELECT DISTINCT
        CAST(RTP.ExternalId AS CHAR(25)) AS 'transID'
    ,   CASE RTP.Activity 
            WHEN 0 THEN 'Payment' 
            WHEN 1 THEN 'Void' 
        END AS 'transType'
    ,   RTP.TransactionCreateDate AS 'createdDate'
    ,   RTP.Amount AS 'paymentAmount_rtp'
    ,   T.Amount AS 'paymentAmount_tenders'
    ,   CASE 
            WHEN RTP.Amount = T.Amount 
            THEN '1' 
            ELSE '0' 
        END AS DesiredResult
    ,   RTP.EffectiveDate AS 'paymentDate'
    ,   CAST(RTP.Id AS NVARCHAR(50)) AS 'payment_Id'
    ,   RTP.TransactionBatchId AS 'batchId'
    ,   T.TenderTypeId AS 'TenderType'
    ,   CAST(TType.Name AS CHAR(10)) AS 'PaymentType'
    FROM 
        Reporting.TransactionPayments RTP
    INNER JOIN dbo.Tenders T
        ON T.TransactionId = RTP.TransactionId
    INNER JOIN dbo.TenderTypes TType
        ON TType.Id = T.TenderTypeId
    WHERE 
        CAST(RTP.TransactionCreateDate AS DATE) >= '12/01/2019'     
) m
WHERE payment_Id IN 
(
    SELECT 
        n.payment_Id
    FROM 
    (
        SELECT DISTINCT
            CAST(RTP.ExternalId AS CHAR(25)) AS 'transID'
        ,   CASE RTP.Activity 
                WHEN 0 THEN 'Payment' 
                WHEN 1 THEN 'Void' 
                END AS 'transType'
        ,   RTP.TransactionCreateDate AS 'createdDate'
        ,   RTP.Amount AS 'paymentAmount_rtp'
        ,   T.Amount AS 'paymentAmount_tenders'
        ,   CASE 
                WHEN RTP.Amount = T.Amount 
                THEN '1' 
                ELSE '0' 
            END AS DesiredResult
        ,   RTP.EffectiveDate AS 'paymentDate'
        ,   CAST(RTP.Id AS NVARCHAR(50)) AS 'payment_Id'
        ,   RTP.TransactionBatchId AS 'batchId'
        ,   T.TenderTypeId AS 'TenderType'
        ,   CAST(TType.Name AS CHAR(10)) AS 'PaymentType'
        FROM 
            Reporting.TransactionPayments RTP
        INNER JOIN dbo.Tenders T
            ON T.TransactionId = RTP.TransactionId
        INNER JOIN dbo.TenderTypes TType
            ON TType.Id = T.TenderTypeId
        WHERE 
            CAST(RTP.TransactionCreateDate AS DATE) >= '12/01/2019'
    ) n
    GROUP BY 
        n.payment_Id
    HAVING COUNT(*) > 1
)

更新

如果你看一下屏幕截图,红色的行就是我要排除的那些,它们是相同的付款 ID,相同的付款类型 "CASH"。

绿色行是我需要查找的记录类型,相同的付款 ID,3 次付款,2 次 "CASH",1 次 "CHECK"。

我尝试了共享的代码,但结果删除了付款类型为 "CHECK" 的行,其他所有内容都留在那里。

您可以select下一次查询具有相同付款ID但不同付款类型的交易:

SELECT payment_Id FROM payments GROUP BY payment_Id HAVING COUNT(DISTINCT paymentType) > 1;

因此您的最终查询可能是下一个:

SELECT 
    transID,   
    transType,   
    createdDate,   
    paymentAmount_rtp,   
    paymentAmount_tenders,   
    DesiredResult,   
    paymentDate,   
    payment_Id,   
    batchId,   
    TenderType,
   PaymentType 
FROM payments 
JOIN (
    SELECT payment_Id 
    FROM payments 
    GROUP BY payment_Id 
    HAVING COUNT(DISTINCT paymentType) > 1
) dp on dp.payment_Id = payments.payment_Id;