SQL Server:选择付款id相同但付款类型不同的记录
我只需要选择具有相同付款id但不同付款类型的记录。 在下面的输出示例中,第1行和第2行具有相同的付款id和付款类型。 我需要排除这些,只返回像3、4和5这样的行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
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日
)。