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;
我只需要 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;