每列不同的值

时间:2014-07-18 16:22:17

标签: sql sql-server distinct partition

我正在查看基于各种标准的政策例外情况报告,例如信标评分,债务收入和贷款价值。此信息保存在多个不同的表中,现在贷款到价值列导致我的报表中有多个条目,因为特定贷款可能包含多个抵押品。为了进行适当的异常监控,我只需要一个条目。

尽管如此,我如何执行以下代码,dbo.Folders.Id具有不同的值?只是把'DISTINCT'在SELECT语句之后似乎不起作用。 (敏感值掩盖了'#'。)

SELECT  dbo.Folders.LoanOfficerId, 
        dbo.Folders.Id, 
        dbo.CollateralType.Description, 
        dbo.Customers.CUSTNAME, 
        dbo.Folders.DateLoanActivated, 
        dbo.Folders.CurrentAccountBalance, 
        dbo.Folders.UnadvancedCommitAmount, 
        dbo.Folders.BeaconScore, 
        dbo.Folders.DebtToIncome, 
        dbo.Collateral.LoanToValue
  FROM dbo.Folders 
    INNER JOIN dbo.Customers 
           ON dbo.Folders.CustomersNAMEKEY = dbo.Customers.NAMEKEY 
    INNER JOIN dbo.Collateral 
           ON dbo.Folders.Id = dbo.Collateral.FoldersID 
    INNER JOIN dbo.CollateralType 
           ON dbo.Collateral.CollateralTypeCollCode = dbo.CollateralType.CollCode
  WHERE (     (dbo.Folders.BeaconScore < ###) 
          AND (dbo.Folders.BeaconScore > ###) 
          AND (dbo.Folders.CloseCode = 'O') 
          AND (dbo.Folders.CollateralCode <> ##)
        ) 
        OR (     (dbo.Folders.CloseCode = 'O') 
             AND (dbo.Folders.CustomerType <> '###') 
             AND (dbo.Folders.CustomerType <> '###') 
             AND (dbo.Folders.DebtToIncome > ##)
           ) 
        OR (     (dbo.Folders.CloseCode = 'O') 
             AND (dbo.Folders.CustomerType = '###') 
             AND (dbo.Folders.DebtToIncome > ##)
           ) 
        OR (     (dbo.Folders.CloseCode = 'O') 
             AND (dbo.Folders.CustomerType = '###') 
             AND (dbo.Folders.DebtToIncome > ##)
           )
        OR (dbo.Collateral.LoanToValue > dbo.CollateralType.LTV)

欢迎对我的代码提出任何建设性的批评。 (以上语句中的静态值位于后面将使用阈值/条件表进行更正的文档中。)从我所看到的,其他人建议将ROW_COUNT()与PARTITION一起使用,但我无法使语法有效。 / p>

1 个答案:

答案 0 :(得分:0)

关于格式的注释:学习使用表别名。它们使查询更易于阅读和编写。

如果您只需要结果中的一行,则可以使用row_number()。这列举了每个文件夹的行(在您的情况下),您只需使用第一个。您可以使用以下方式执行此操作:

with t as (
      <your query here>
     )
select t.*
from (select t.*,
             row_number() over (partition by FoldersId order by (select NULL)) as seqnum
      from t
     ) t
where seqnum = 1;

另一方面,如果您需要汇总来自附属表的信息,那么您可以在查询中使用group by和相应的聚合函数。