SQL Server:选择付款id相同但付款类型不同的记录

SQL Server:选择付款id相同但付款类型不同的记录,sql,sql-server-2012,Sql,Sql Server 2012,我只需要选择具有相同付款id但不同付款类型的记录。 在下面的输出示例中,第1行和第2行具有相同的付款id和付款类型。 我需要排除这些,只返回像3、4和5这样的行 transID transType createdDate paymentAmount_rtp paymentAmount_tenders DesiredResult paymentDate payment_Id batchId TenderType Payme

我只需要选择具有相同付款id但不同付款类型的记录。 在下面的输出示例中,第1行和第2行具有相同的付款id和付款类型。 我需要排除这些,只返回像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,相同的付款类型“现金”

绿色的行是我需要查找的记录类型,相同的付款id,3次付款,2次“现金”,1次“支票”

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


您可以通过下一次查询选择具有相同付款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;

您可以通过下一次查询选择付款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;

您发布的查询不仅仅返回重复记录。使用CTE和窗口聚合函数是否更有意义?Reporting.TransactionPayments.TransactionCreateDate的列类型是什么?如果它已经是
日期
日期时间
日期时间2
日期时间偏移量
类型,则无需
将其转换为
日期
值。如果它是一个日期作为文本值,那么您可以更改该列以使用正确的日期值吗?如果没有,则使用
CONVERT
并指定确切的日期格式,以确保您的查询在不同的计算机上一致运行(否则,它对区域设置/区域性敏感,将根据用户的设置报告
2019年5月6日或6月5日
)。您发布的查询不仅仅返回重复记录。使用CTE和窗口聚合函数是否更有意义?Reporting.TransactionPayments.TransactionCreateDate
的列类型是什么?如果它已经是
日期
日期时间
日期时间2
日期时间偏移量
类型,则无需
将其转换为
日期
值。如果它是一个日期作为文本值,那么您可以更改该列以使用正确的日期值吗?如果没有,则使用
CONVERT
并指定确切的日期格式,以确保查询在不同的计算机上一致运行(否则,查询对区域/文化敏感,并将根据用户的设置报告
2019年5月6日或2019年6月5日
)。