У нас есть требование вернуть иерархию «активных» записей учетной записи в определенный формат с помощью SQL.
Вот ссылка на мои образцы данных и ожидаемые результаты: SAMPLEDATA
Соображения:
- Родительский аккаунт будет пустым, если родительский аккаунтучетная запись «неактивна»
- Root Parent будет самым верхним «активным» родителем
- Неактивные учетные записи будут удалены из таблицы
Я уже получил всеиерархия счетов (рекурсивный CTE).Однако проблема заключается в родительской учетной записи и столбцах «Root».Я не могу получить правильные значения для них, если иерархия сложна или имеет неактивных родителей.(например, если верхний родительский элемент неактивен или если есть несколько родительских учетных записей, а некоторые неактивны)
Я пытался использовать подзапросы для этих столбцов, но я думаю, что мне все еще что-то не хватает ...
Может ли кто-нибудь просветить меня правильным подходом к этому?Заранее спасибо!
Вот мой сценарий:
WITH aCTE ([Client Number], [Client Level], accountid) AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY parentaccountid ASC) [Client Number]
,0 [Client Level]
,accountid
FROM
Account
WHERE
parentaccountid IS NULL
UNION ALL
SELECT
b.[Client Number]
,b.[Client Level] + 1
,a.accountid
FROM
Account a
JOIN aCTE b ON a.parentaccountid = b.accountid
WHERE
a.statecode = 0 --Active
)
SELECT DISTINCT
ac.[Client Number]
,ac.[Client Level]
,fa.accountnumber [Account Number]
,fa.[name] [Account Name]
,[Parent Account] = CASE
WHEN (SELECT TOP 1 a.[name] FROM Account a JOIN aCTE b ON a.accountid = b.accountid
WHERE b.[Client Number] = ac.[Client Number]
ORDER BY b.[Client Level] ASC) != fa.[name]
THEN fa.parentaccountidname
ELSE ''
END
,[Root Parent Number] = (SELECT TOP 1 a.accountnumber FROM Account a JOIN aCTE b ON a.accountid = b.accountid
WHERE b.[Client Number] = ac.[Client Number]
ORDER BY b.[Client Level] ASC)
,[Root Parent Name] = (SELECT TOP 1 a.[name] FROM Account a JOIN aCTE b ON a.accountid = b.accountid
WHERE b.[Client Number] = ac.[Client Number]
ORDER BY b.[Client Level] ASC)
FROM
FilteredAccount fa
JOIN aCTE ac ON fa.accountid = ac.accountid
WHERE
fa.statecode = 0 --Active
ORDER BY
ac.[Client Number] ASC
,ac.[Client Level] ASC