簡體   English   中英

從SQL查詢重復

[英]Duplicates from an SQL Query

我有一個從多個連接中檢索的數據集。 我在我的語句中使用了SELECT DISTINCT,但我仍然在結果集中看到重復項。 這是代碼:

SELECT DISTINCT Account
, PayoffAmtDOL as 'Payoff Amount DOL'
, PayoffAmtLOG as 'Payoff Amount LOG'
, PayoffAmountLive as 'Payoff Amount Live'
, [Difference]
, PrincipalBalance as 'Principal Balance'
, CreationDate as 'Date Entered System'
, CACSState as 'CACS State at Entry'
, PaymentsMade AS 'Payments Made'
, TotalPaymentAmount as 'Total Payment Amount'
, 'Liquidation Percentage' = CASE WHEN PayoffAmountLive = 0 THEN 1
                            WHEN ISNULL([Difference],0) = ISNULL(PayoffAmtDOL, 0) THEN 1
                            WHEN ISNULL([Difference],0) < 0 AND ISNULL(PayoffAmtDOL, 0) > 0 THEN 0
                            WHEN ISNULL([Difference],0) > 0 AND ISNULL(PayoffAmtDOL, 0) < 0 THEN 1
                            WHEN ISNULL([Difference],0) > ISNULL(PayoffAmtDOL, 0) THEN 1
                            WHEN [Difference] > 0 AND ISNULL(PayoffAmtDOL, 0) = 0 THEN 1
                            WHEN ISNULL(PayoffAmtDOL, 0) = 0 THEN 0
                            ELSE ISNULL([Difference],0)/ISNULL(PayoffAmtDOL, 0) END
          , Cnt = 1
FROM 
(
SELECT DISTINCT a.Account,
       c.PayoffAmtDOL,
       c.PayoffAmtLOG,
       (ISNULL(c.PayoffAmtCACS, cacs.payoff_amt)) as 'PayoffAmountLive',
       (ISNULL(c.PayoffAmtDOL, 0) - (ISNULL(c.PayoffAmtCACS , ISNULL(cacs.payoff_amt, 0)))) as 'Difference',
       c.PrincipalBalance,
       c.CreationDate,
       c.CACSState,
       (SELECT COUNT(PaymentID)
        FROM tblATLPaymentInfo p
        WHERE p.AccountID = a.AccountID
          AND CONVERT(DATETIME, CONVERT(VARCHAR(10), p.CreationDate, 101)) >=  '1/1/2014'
          AND CONVERT(DATETIME, CONVERT(VARCHAR(10), p.CreationDate, 101)) <= '3/27/2014'
        ) as 'PaymentsMade',
         (SELECT SUM(PaymentAmount)
        FROM tblATLPaymentInfo p
        WHERE p.AccountID = a.AccountID
          AND CONVERT(DATETIME, CONVERT(VARCHAR(10), p.CreationDate, 101)) >= '1/1/2014'
          AND CONVERT(DATETIME, CONVERT(VARCHAR(10), p.CreationDate, 101)) <= '3/27/2014'
        ) as 'TotalPaymentAmount'

FROM tblATLAcctInfo a
RIGHT JOIN tblATLClaimInfo c
    ON c.AccountID = a.AccountID
LEFT JOIN SCFLOKYDCMSQL03.CACS_DM.dbo.Cacs_Info cacs
    ON cacs.Account = a.Account
WHERE CONVERT(DATETIME, CONVERT(VARCHAR(10), c.CreationDate, 101)) >= '1/1/2014'
    AND CONVERT(DATETIME, CONVERT(VARCHAR(10), c.CreationDate, 101)) <=  '3/27/2014'
    AND c.ClaimTypeID = (SELECT  DISTINCT ClaimTypeID FROM tblATLClaimType WHERE ClaimType = 'N02 - Claims')
) a
ORDER BY Account

以下是重復行的示例:

AccountID   DateEntered
123     01/19/2014
123     01/21/2014
345     02/1/2014
345     02/10/2014

兩者之間的差異似乎是輸入的日期。 也許選擇Row_Number()然后刪除更晚的日期可能是一個解決方案

DISTINCT不應該返回多行..每行應該至少有一列不同,不是嗎? 對於字符數據,有時可能會被不可見的差異所欺騙,例如尾隨空格。 但不確定這是否是這種情況。

你能舉一個重復行的例子嗎?

好的,我看到了你的編輯。 您必須選擇要顯示的日期。 試試這個以獲得每個AccountID的最早日期:

 SELECT AccountID, MIN(DateEntered) AS DateEntered
 FROM ....
 GROUP BY AccountID
 ORDER BY AccountID

您可以在SELECT中添加更多列,只要它們不同,就不會獲得更多行。

如果需要,可以向選擇中添加COUNT(*)以獲取分組的行數。

DISTINCT將僅拒絕完全重復的行,每個ID上的DateEntered不同。 如果你想要最新的,請使用Max(DateEntered)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM