2014-03-27 67 views
0

我有一个从多个连接中检索的数据集。我在我的语句中使用了SELECT DISTINCT,但仍然在结果集中看到重复项。下面是代码:来自SQL查询的重复项

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()然后删除后面的日期可能是一个解决方案

+0

因为你加入了多个表,所以你可能在每一行中都没有相同的数据,你可以检查行并告诉我你有没有重复的行? –

+0

我看到一个具有相同的信息,除了创建日期 –

+1

如果你想区分只有一些列,你可以改变选择和包括ROW_NUMBER()OVER(分区BY XXXX ORDER BY YYYY),然后选择那些row_numbers等于1 –

回答

1

DISTINCT不应该返回多行..至少应该有一列在每一行中不同,否?对于字符数据,有时可能会被不可见的差异愚弄,例如尾随空格。虽然不确定这是否是这种情况。

你可以举一个重复行的例子吗?

好的,我看到你的编辑。您必须选择要显示的日期。试试这个每个帐户ID获得的最早日期:

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

您可以在选择添加更多的列,只要它们是不同的,你不会得到更多的行。

如果需要,可以将COUNT(*)添加到select以获取分组的行数。

+0

我加入到我的问题编辑上面 –

+0

我添加到我的答案上面,希望它有助于:) – SAS

1

DISTINCT只会拒绝重复的行,DateEntered在每个ID上都不相同。如果你想要最新的,使用Max(DateEntered)