2015-11-19 2 views
2

У меня есть этот код, и мне сложно понять, почему он не работает. Я искал решение, которое на самом деле является тем, как мой код оказался таким, каким он есть, но он просто не работает правильно ... Любая помощь будет оценена.SQL Server: определение максимального значения в наборе результатов

Что я пытаюсь сделать, это выбрать одну запись для каждого клиента. Выбранная запись должна быть той, которая имеет самый высокий баланс должника. Вместо этого я получаю все должники со своими остатками. Почти как это не группируя их обратно клиенту ...

SELECT 
    Debtorness.ClientName, 
    Debtorness.DebtorName, 
    MAX(Debtorness.DFB) 
FROM 
    (SELECT 
     Clients.Name AS ClientName, 
     Debtors.Name AS DebtorName, 
     (CalcAging.FundedBalance) AS DFB 
    FROM 
     Clients 
    INNER JOIN 
     CalcAging ON Clients.ClientKey = CalcAging.ClientKey 
    INNER JOIN 
     Debtors ON CalcAging.DebtorKey = Debtors.DebtorKey 
    INNER JOIN 
     CalcClient ON Clients.ClientKey = CalcClient.ClientKey 
    WHERE 
     Clients.Inactive='0' 
    GROUP BY 
     Clients.Name, Debtors.Name, CalcAging.FundedBalance, 
     CalcAging.MasterDebtorKey) AS Debtorness 
GROUP BY 
    Debtorness.ClientName, Debtorness.DebtorName, Debtorness.DFB 
ORDER BY 
    Debtorness.ClientName ASC 

Пример вывода о том, что я получаю:

Client1 | Debtor23 | Balance  
Client1 | Debtor47 | Balance 
Client1 | Debtor14 | Balance 
Client2 | Debtor72 | Balance 
Client2 | Debtor30 | Balance 

Etc ... Для всех клиентов. Опять же, я хочу видеть всех клиентов, но я просто хочу, чтобы должник с самым высоким балансом для этого клиента ... Спасибо!

ответ

2

Использование row_number()

WITH cte as (
    SELECT 
     Clients.Name AS ClientName, 
     Debtors.Name AS DebtorName, 
     CalcAging.FundedBalance AS DFB, 
     ROW_NUMBER() over 
      (PARTITION BY Clients.Name ORDER BY CalcAging.FundedBalance DESC) as rn 
    FROM  
     Clients INNER JOIN 
     CalcAging ON Clients.ClientKey = CalcAging.ClientKey INNER JOIN 
     Debtors ON CalcAging.DebtorKey = Debtors.DebtorKey INNER JOIN 
     CalcClient ON Clients.ClientKey = CalcClient.ClientKey 
    WHERE 
     Clients.Inactive='0' 
) 
SELECT * 
FROM cte 
WHERE rn = 1; 
+0

Спасибо так много! Теперь я должен посмотреть, что делает раздел, и перечеркнуть означает ... Ха-ха. Тем не менее, это работает как чемпион! Ура! –

+0

Примите этот ответ как правильный, если вы поможете вам с вашим вопросом. –

0

быстрый и грязный раствор, чтобы сделать выбор по сравнению с текущим результатом. Это продолжить работу с чем вы уже есть и что вы уже знаете как использовать.

результат:

select clientname,debtorname,balance_column from (SELECT Debtorness.ClientName, 
    Debtorness.DebtorName, 
    MAX(Debtorness.DFB) 
FROM (

SELECT 
    Clients.Name AS ClientName, 
    Debtors.Name AS DebtorName, 
    (CalcAging.FundedBalance) AS DFB 
FROM  
    Clients INNER JOIN 
    CalcAging ON Clients.ClientKey = CalcAging.ClientKey INNER JOIN 
    Debtors ON CalcAging.DebtorKey = Debtors.DebtorKey INNER JOIN 
    CalcClient ON Clients.ClientKey = CalcClient.ClientKey 
WHERE 
    Clients.Inactive='0' 
GROUP BY 
    Clients.Name, Debtors.Name, CalcAging.FundedBalance, CalcAging.MasterDebtorKey 
) AS Debtorness 
GROUP BY Debtorness.ClientName, Debtorness.DebtorName, Debtorness.DFB 
ORDER BY Debtorness.ClientName Asc) group by clientname having a.balance_column = Max(a.balance_column) 
+0

замените balance_column на колонку баланса – davejal

+0

Если у вас возникнут проблемы с этим, но я думаю, что вижу, куда вы направляетесь. Я пошел с решением Хуана ниже, но спасибо за помощь! –

+0

Просто пытайтесь помочь, без проблем – davejal

Смежные вопросы