Возврат отфильтрованной иерархии в SQL - CTE / SubQuery - PullRequest
0 голосов
/ 20 сентября 2018

У нас есть требование вернуть иерархию «активных» записей учетной записи в определенный формат с помощью 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
...