2015-03-27 3 views
1

Это мой самый первый заданный вопрос (когда-либо). Поэтому, пожалуйста, будьте терпеливы, пока я пытаюсь объяснить свою проблему.Структура счета с несколькими вложенными и рекурсивными родительскими/дочерними иерархиями

У меня есть таблица следующим образом, который дает мне иерархическую структуру для некоторого счета:

declare @AccountDefinitions table 
    (
    AccountID int identity(1, 1) 
        primary key 
        not null, 
    AccountNumber nvarchar(11) not null, 
    AccountType nvarchar(1) not null, 
    SumSign1 smallint, 
    SumAccount1 nvarchar(11), 
    SumSign2 smallint, 
    SumAccount2 nvarchar(11), 
    SumSign3 smallint, 
    SumAccount3 nvarchar(11) 
    ) 

Если учетная запись суммируется (добавляются к другому АСоипу), то родительский счет находится в SumAccount1. Итак, SumAccount1 снова можно найти в AccountNumber. Это обычная иерархия родителей/детей, которую можно легко решить с помощью CTE, как описано в нескольких решениях. Однако есть еще два родительских столбца с именами SumAccount2 и SumAccount3. Это означает, что учетная запись может содержать до трех родителей. Но иногда есть только два родителя или нет родителей. В таких случаях SumAccount3 (и/или другие) будет NULL.

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

Вот некоторые тестовые данные, чтобы играть вокруг с:

insert into @AccountDefinitions 
     (AccountNumber, AccountType, SumSign1, SumAccount1, SumSign2, 
     SumAccount2, SumSign3, SumAccount3) 
values (N'K07_005', N'U', 0, null, 0, null, 0, null), 
     (N'K07_010', N'U', 0, null, 0, null, 0, null), 
     (N'K07_010A', N'U', 0, null, 0, null, 0, null), 
     (N'K07_020', N'R', 0, null, 0, null, 0, null), 
     (N'K07_020A', N'R', 0, null, 0, null, 0, null), 
     (N'K07_020AA', N'R', 0, null, 0, null, 0, null), 
     (N'K07_021', N'U', 0, null, 0, null, 0, null), 
     (N'K07_022', N'U', 0, null, 0, null, 0, null), 
     (N'K07_025', N'U', 0, null, 0, null, 0, null), 
     (N'K07_025A', N'U', 0, null, 0, null, 0, null), 
     (N'K07_035', N'U', 1, N'K07_060', 0, null, 0, null), 
     (N'K07_060', N'U', 1, N'K07_930', 0, null, 0, null), 
     (N'K07_090', N'U', 0, null, 0, null, 0, null), 
     (N'K07_091', N'U', 0, null, 0, null, 0, null), 
     (N'K07_091P', N'U', 0, null, 1, N'K07_O091', 0, null), 
     (N'K07_092', N'U', 0, null, 0, null, 0, null), 
     (N'K07_095', N'U', 0, null, 0, null, 0, null), 
     (N'K07_096', N'U', 0, null, 0, null, 0, null), 
     (N'K07_100', N'U', 0, null, 1, N'K07_1000', 0, null), 
     (N'K07_1000', N'I', 1, N'K07_O100', 0, null, 0, null), 
     (N'K07_1010', N'I', 1, N'K07_100', 1, N'K07_101P', 1, N'K07_C130'), 
     (N'K07_101P', N'U', 1, N'K07_O101', 0, null, 0, null), 
     (N'K07_110', N'I', 1, N'K07_130', 0, null, 0, null), 
     (N'K07_120', N'I', 1, N'K07_130', 0, null, 0, null), 
     (N'K07_120P', N'U', 1, N'K07_O120', 0, null, 0, null), 
     (N'K07_160', N'I', 1, N'K07_170', 0, null, 0, null), 
     (N'K07_170', N'I', 1, N'K07_251', 0, null, 0, null), 
     (N'K07_180', N'U', 1, N'K07_190', 0, null, 0, null), 
     (N'K07_185', N'S', 1, N'K07_190', 0, null, 0, null), 
     (N'K07_190', N'S', 0, null, 0, null, 0, null), 
     (N'K07_200', N'I', 1, N'K07_2000', 1, N'K07_250', 0, null), 
     (N'K07_2000', N'U', 0, null, 0, null, 0, null), 
     (N'K07_201', N'I', 1, N'K07_C810', 1, N'K07_900', 1, N'K07_200'), 
     (N'K07_202', N'I', 1, N'K07_202P', 1, N'K07_251', 0, null), 
     (N'K07_202P', N'U', 0, null, 0, null, 0, null), 
     (N'K07_205', N'C', 1, N'K07_091P', -1, N'K07_251', 0, null), 
     (N'K07_250', N'U', 1, N'K07_300', 1, N'K07_2500', 0, null), 
     (N'K07_2500', N'U', 0, null, 0, null, 0, null), 
     (N'K07_251', N'I', 1, N'K07_301', 1, N'K07_251P', 0, null), 
     (N'K07_251P', N'U', 0, null, 0, null, 0, null), 
     (N'K07_270', N'T', -1, N'K07_300', 1, N'K07_2700', 0, null), 
     (N'K07_2700', N'T', 1, N'K07_O270', 0, null, 0, null), 
     (N'K07_271', N'C', -1, N'K07_301', 1, N'K07_271P', 0, null), 
     (N'K07_271P', N'T', 0, null, 1, N'K07_O271', 0, null), 
     (N'K07_280', N'T', -1, N'K07_300', 1, N'K07_2800', 0, null), 
     (N'K07_2800', N'T', 1, N'K07_O280', 0, null, 0, null), 
     (N'K07_281', N'C', -1, N'K07_301', 1, N'K07_281P', 0, null), 
     (N'K07_281P', N'T', 0, null, 1, N'K07_O281', 0, null), 
     (N'K07_300', N'U', 1, N'K07_400', 1, N'K07_3000', 0, null), 
     (N'K07_3000', N'U', 0, null, 0, null, 0, null), 
     (N'K07_301', N'I', 1, N'K07_401', 1, N'K07_301P', 0, null), 
     (N'K07_301P', N'U', 0, null, 0, null, 0, null), 
     (N'K07_320', N'T', 1, N'K07_400', 0, null, 0, null), 
     (N'K07_321', N'I', 1, N'K07_401', 1, N'K07_342', 0, null), 
     (N'K07_322', N'I', 1, N'K07_401', 1, N'K07_342', 0, null), 
     (N'K07_330', N'T', 1, N'K07_400', 0, null, 0, null), 
     (N'K07_331', N'I', 1, N'K07_401', 0, null, 0, null), 
     (N'K07_340', N'T', 1, N'K07_400', 0, null, 0, null), 
     (N'K07_341', N'I', 1, N'K07_401', 1, N'K07_342', 0, null), 
     (N'K07_342', N'C', 0, null, 0, null, 0, null), 
     (N'K07_350', N'T', 1, N'K07_400', 0, null, 0, null), 
     (N'K07_351', N'C', 1, N'K07_401', 0, null, 0, null), 
     (N'K07_400', N'U', 1, N'K07_600', 0, null, 0, null), 
     (N'K07_401', N'C', 1, N'K07_601', 1, N'K07_510', 0, null), 
     (N'K07_420', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_421', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_430', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_431', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_440', N'T', 0, null, 0, null, 0, null), 
     (N'K07_441', N'T', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_450', N'T', 0, null, 0, null, 0, null), 
     (N'K07_451', N'T', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_455', N'C', 1, N'K07_463', 1, N'K07_466', 0, null), 
     (N'K07_456', N'U', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_457', N'C', 1, N'K07_463', 1, N'K07_466', 0, null), 
     (N'K07_458', N'C', 1, N'K07_463', 1, N'K07_466', 0, null), 
     (N'K07_459', N'C', 1, N'K07_463', 1, N'K07_466', 0, null), 
     (N'K07_460', N'T', 0, null, 0, null, 0, null), 
     (N'K07_461', N'T', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_462', N'T', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_463', N'T', 1, N'K07_501', 0, null, 0, null), 
     (N'K07_464', N'T', 1, N'K07_465', 0, null, 0, null), 
     (N'K07_465', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_466', N'C', 0, null, 1, N'K07_502', 0, null), 
     (N'K07_470', N'T', 0, null, 0, null, 0, null), 
     (N'K07_471', N'T', 1, N'K07_485', 0, null, 0, null), 
     (N'K07_472', N'C', 1, N'K07_475', 0, null, 0, null), 
     (N'K07_473', N'C', 1, N'K07_475', 0, null, 0, null), 
     (N'K07_474', N'C', 1, N'K07_475', 0, null, 0, null), 
     (N'K07_475', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_476', N'C', 1, N'K07_475', 0, null, 0, null), 
     (N'K07_480', N'T', 0, null, 0, null, 0, null), 
     (N'K07_481', N'T', 1, N'K07_485', 0, null, 0, null), 
     (N'K07_482', N'T', 1, N'K07_485', 0, null, 0, null), 
     (N'K07_483', N'T', 1, N'K07_485', 0, null, 0, null), 
     (N'K07_484', N'T', 1, N'K07_485', 0, null, 0, null), 
     (N'K07_485', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_488', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_489', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_490', N'T', 1, N'K07_500', 0, null, 0, null), 
     (N'K07_491', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_492', N'C', 1, N'K07_501', 1, N'K07_502', 0, null), 
     (N'K07_500', N'T', -1, N'K07_600', 0, null, 0, null), 
     (N'K07_501', N'T', -1, N'K07_601', 0, null, 0, null), 
     (N'K07_502', N'C', -1, N'K07_510', 0, null, 0, null), 
     (N'K07_510', N'C', 0, null, 0, null, 0, null), 
     (N'K07_520', N'T', -1, N'K07_600', 0, null, 0, null), 
     (N'K07_521', N'C', -1, N'K07_601', 1, N'K07_466', 0, null), 
     (N'K07_522', N'C', -1, N'K07_601', 1, N'K07_466', 0, null), 
     (N'K07_530', N'U', 1, N'K07_600', 0, null, 0, null), 
     (N'K07_531', N'I', 1, N'K07_601', 1, N'K07_591', 0, null), 
     (N'K07_532', N'C', -1, N'K07_601', 1, N'K07_703', 1, N'K07_502'), 
     (N'K07_533', N'I', 1, N'K07_601', 1, N'K07_591', 0, null), 
     (N'K07_540', N'U', 1, N'K07_600', 0, null, 0, null), 
     (N'K07_541', N'I', 1, N'K07_601', 1, N'K07_591', 0, null), 
     (N'K07_551', N'I', 1, N'K07_601', 1, N'K07_591', 0, null), 
     (N'K07_561', N'C', -1, N'K07_601', -1, N'K07_591', 0, null), 
     (N'K07_571', N'I', 1, N'K07_601', 1, N'K07_591', 0, null), 
     (N'K07_581', N'C', -1, N'K07_601', -1, N'K07_591', 0, null), 
     (N'K07_591', N'C', 0, null, 0, null, 0, null), 
     (N'K07_600', N'U', 1, N'K07_700', 0, null, 0, null), 
     (N'K07_601', N'C', 1, N'K07_701', 0, null, 0, null), 
     (N'K07_620', N'T', 1, N'K07_700', 0, null, 0, null), 
     (N'K07_621', N'C', 1, N'K07_701', 0, null, 0, null), 
     (N'K07_700', N'U', 0, null, 0, null, 0, null), 
     (N'K07_703', N'T', 1, N'K07_706', 1, N'K07_704', 0, null), 
     (N'K07_704', N'T', 1, N'K07_707', 0, null, 0, null), 
     (N'K07_705', N'T', 1, N'K07_706', 0, null, 0, null), 
     (N'K07_705CO', N'T', 1, N'K07_705SU', 0, null, 0, null), 
     (N'K07_705GA', N'T', 1, N'K07_705SU', 0, null, 0, null), 
     (N'K07_705MS', N'T', 1, N'K07_705SU', 0, null, 0, null), 
     (N'K07_705OT', N'T', 1, N'K07_705SU', 0, null, 0, null), 
     (N'K07_705RD', N'T', 1, N'K07_705SU', 0, null, 0, null), 
     (N'K07_705SU', N'T', 1, N'K07_707', 0, null, 0, null), 
     (N'K07_706', N'T', 0, null, 0, null, 0, null), 
     (N'K07_707', N'T', 0, null, 0, null, 0, null), 
     (N'K07_710', N'U', 1, N'K07_760', 1, N'K07_7100', 1, N'K07_C050'), 
     (N'K07_7100', N'U', 1, N'K07_O710', 0, null, 0, null), 
     (N'K07_720', N'U', 1, N'K07_760', 1, N'K07_7200', 1, N'K07_C055'), 
     (N'K07_7200', N'U', 1, N'K07_O720', 0, null, 0, null), 
     (N'K07_7300', N'U', 1, N'K07_O730', 0, null, 0, null), 
     (N'K07_7400', N'U', 1, N'K07_O740', 0, null, 0, null), 
     (N'K07_7500', N'U', 1, N'K07_O750', 0, null, 0, null), 
     (N'K07_760', N'U', 1, N'K07_910', 1, N'K07_7600', 1, N'K07_C075'), 
     (N'K07_7600', N'U', 0, null, 0, null, 0, null), 
     (N'K07_800', N'U', 1, N'K07_810', 0, null, 0, null), 
     (N'K07_800N', N'U', 1, N'K07_810N', 0, null, 0, null), 
     (N'K07_805', N'U', 1, N'K07_810', 0, null, 0, null), 
     (N'K07_805N', N'U', 1, N'K07_810N', 0, null, 0, null), 
     (N'K07_810', N'U', 0, null, 0, null, 0, null), 
     (N'K07_810N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_815', N'U', 1, N'K07_825', 0, null, 0, null), 
     (N'K07_815N', N'U', 1, N'K07_825N', 0, null, 0, null), 
     (N'K07_820', N'U', 1, N'K07_825', 0, null, 0, null), 
     (N'K07_820N', N'U', 1, N'K07_825N', 0, null, 0, null), 
     (N'K07_825', N'U', 0, null, 0, null, 0, null), 
     (N'K07_825N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_830', N'U', 1, N'K07_840', 0, null, 0, null), 
     (N'K07_830N', N'U', 1, N'K07_840N', 0, null, 0, null), 
     (N'K07_835', N'U', 1, N'K07_840', 0, null, 0, null), 
     (N'K07_835N', N'U', 1, N'K07_840N', 0, null, 0, null), 
     (N'K07_840', N'U', 0, null, 0, null, 0, null), 
     (N'K07_840N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_845', N'U', 1, N'K07_855', 0, null, 0, null), 
     (N'K07_845N', N'U', 1, N'K07_855N', 0, null, 0, null), 
     (N'K07_850', N'U', 1, N'K07_855', 0, null, 0, null), 
     (N'K07_850N', N'U', 1, N'K07_855N', 0, null, 0, null), 
     (N'K07_855', N'U', 0, null, 0, null, 0, null), 
     (N'K07_855N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_860', N'U', 1, N'K07_870', 0, null, 0, null), 
     (N'K07_860N', N'U', 1, N'K07_870N', 0, null, 0, null), 
     (N'K07_865', N'U', 1, N'K07_870', 0, null, 0, null), 
     (N'K07_865N', N'U', 1, N'K07_870N', 0, null, 0, null), 
     (N'K07_870', N'U', 0, null, 0, null, 0, null), 
     (N'K07_870N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_875', N'U', 1, N'K07_885', 0, null, 0, null), 
     (N'K07_875N', N'U', 1, N'K07_885N', 0, null, 0, null), 
     (N'K07_880', N'U', 1, N'K07_885', 0, null, 0, null), 
     (N'K07_880N', N'U', 1, N'K07_885N', 0, null, 0, null), 
     (N'K07_885', N'U', 0, null, 0, null, 0, null), 
     (N'K07_885N', N'U', 0, null, 0, null, 0, null), 
     (N'K07_900', N'U', -1, N'K07_920', 0, null, 0, null), 
     (N'K07_905', N'U', 1, N'K07_920', 0, null, 0, null), 
     (N'K07_910', N'U', -1, N'K07_940', 0, null, 0, null), 
     (N'K07_912', N'U', 1, N'K07_920', 0, null, 0, null), 
     (N'K07_915', N'U', 1, N'K07_920', 0, null, 0, null), 
     (N'K07_918', N'U', 1, N'K07_920', 0, null, 0, null), 
     (N'K07_920', N'U', 1, N'K07_940', 0, null, 0, null), 
     (N'K07_930', N'U', 1, N'K07_920', 0, null, 0, null), 
     (N'K07_940', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C010', N'U', 1, N'K07_C045', 1, N'K07_C130', -1, N'K07_C050'), 
     (N'K07_C015', N'U', 1, N'K07_C045', 1, N'K07_C135', -1, N'K07_C055'), 
     (N'K07_C045', N'U', 0, null, 0, null, -1, N'K07_C075'), 
     (N'K07_C050', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C055', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C060', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C065', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C070', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C075', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C100', N'U', 1, N'K07_C125', 1, N'K07_C130', 0, null), 
     (N'K07_C105', N'U', 1, N'K07_C125', 1, N'K07_C135', 0, null), 
     (N'K07_C125', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C130', N'U', 1, N'K07_C155', 1, N'K07_C630', 0, null), 
     (N'K07_C135', N'U', 1, N'K07_C155', 1, N'K07_C635', 0, null), 
     (N'K07_C155', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C400', N'U', 1, N'K07_C425', 0, null, 0, null), 
     (N'K07_C405', N'U', 1, N'K07_C425', 0, null, 0, null), 
     (N'K07_C425', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C430', N'U', 1, N'K07_C455', 1, N'K07_C580', 1, N'K07_C4300'), 
     (N'K07_C4300', N'U', 1, N'K07_O430', 0, null, 0, null), 
     (N'K07_C435', N'U', 1, N'K07_C455', 1, N'K07_C585', 1, N'K07_C4350'), 
     (N'K07_C4350', N'U', 1, N'K07_O435', 0, null, 0, null), 
     (N'K07_C4400', N'U', 1, N'K07_O440', 0, null, 0, null), 
     (N'K07_C4450', N'U', 1, N'K07_O445', 0, null, 0, null), 
     (N'K07_C4500', N'U', 1, N'K07_O450', 0, null, 0, null), 
     (N'K07_C455', N'U', 1, N'K07_C4550', 1, N'K07_C890', -1, N'K07_C810'), 
     (N'K07_C4550', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C460', N'U', 1, N'K07_C485', -1, N'K07_C490', 1, N'K07_C580'), 
     (N'K07_C465', N'U', 1, N'K07_C485', -1, N'K07_C495', 1, N'K07_C585'), 
     (N'K07_C485', N'U', -1, N'K07_C515', 0, null, 0, null), 
     (N'K07_C490', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C495', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C500', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C505', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C510', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C515', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C520', N'U', 1, N'K07_C545', 1, N'K07_C490', 1, N'K07_C5200'), 
     (N'K07_C5200', N'U', 1, N'K07_O520', 0, null, 0, null), 
     (N'K07_C525', N'U', 1, N'K07_C545', 1, N'K07_C495', 1, N'K07_C5250'), 
     (N'K07_C5250', N'U', 1, N'K07_O525', 0, null, 0, null), 
     (N'K07_C5300', N'U', 1, N'K07_O530', 0, null, 0, null), 
     (N'K07_C5350', N'U', 1, N'K07_O535', 0, null, 0, null), 
     (N'K07_C5400', N'U', 1, N'K07_O540', 0, null, 0, null), 
     (N'K07_C545', N'U', 0, null, 1, N'K07_C515', 1, N'K07_C5450'), 
     (N'K07_C5450', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C550', N'U', 1, N'K07_C575', 1, N'K07_C580', 0, null), 
     (N'K07_C555', N'U', 1, N'K07_C575', 1, N'K07_C585', 0, null), 
     (N'K07_C575', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C580', N'U', 1, N'K07_C599', 1, N'K07_C730', 0, null), 
     (N'K07_C585', N'U', 1, N'K07_C599', 1, N'K07_C735', 0, null), 
     (N'K07_C599', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C600', N'U', 1, N'K07_C625', 1, N'K07_C630', 0, null), 
     (N'K07_C605', N'U', 1, N'K07_C625', 1, N'K07_C635', 0, null), 
     (N'K07_C625', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C630', N'U', 1, N'K07_C655', 0, null, 0, null), 
     (N'K07_C635', N'U', 1, N'K07_C655', 0, null, 0, null), 
     (N'K07_C655', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C700', N'U', 1, N'K07_C725', 1, N'K07_C730', 0, null), 
     (N'K07_C705', N'U', 1, N'K07_C725', 1, N'K07_C735', 0, null), 
     (N'K07_C725', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C730', N'U', 1, N'K07_C755', 0, null, 0, null), 
     (N'K07_C735', N'U', 1, N'K07_C755', 0, null, 0, null), 
     (N'K07_C755', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C800', N'U', -1, N'K07_C890', 0, null, 0, null), 
     (N'K07_C810', N'U', 0, null, 0, null, 0, null), 
     (N'K07_C830', N'U', -1, N'K07_C890', 0, null, 0, null), 
     (N'K07_C870', N'U', -1, N'K07_C890', 0, null, 0, null), 
     (N'K07_C890', N'U', 0, null, 0, null, 0, null), 
     (N'K07_I110', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I120', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I130', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I140', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I150', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I160', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I170', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I180', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I190', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I200', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I290', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I295', N'T', 1, N'K07_I300', 0, null, 0, null), 
     (N'K07_I300', N'T', 0, null, 0, null, 0, null), 
     (N'K07_I310', N'C', 1, N'K07_I400', 0, null, 0, null), 
     (N'K07_I320', N'C', 1, N'K07_I400', 0, null, 0, null), 
     (N'K07_I400', N'C', 0, null, 0, null, 0, null), 
     (N'K07_O091', N'U', -1, N'K07_O251', 0, null, 0, null), 
     (N'K07_O100', N'U', 1, N'K07_O200', 0, null, 0, null), 
     (N'K07_O101', N'U', 1, N'K07_O202', 0, null, 0, null), 
     (N'K07_O115', N'U', 1, N'K07_O200', 0, null, 0, null), 
     (N'K07_O116', N'U', 1, N'K07_O200', 0, null, 0, null), 
     (N'K07_O117', N'U', 1, N'K07_O200', 0, null, 0, null), 
     (N'K07_O118', N'U', 1, N'K07_O200', 0, null, 0, null), 
     (N'K07_O120', N'U', 1, N'K07_O202', 0, null, 0, null), 
     (N'K07_O200', N'U', 1, N'K07_O250', 0, null, 0, null), 
     (N'K07_O202', N'U', 1, N'K07_O251', 0, null, 0, null), 
     (N'K07_O250', N'U', 1, N'K07_O300', 0, null, 0, null), 
     (N'K07_O251', N'U', 1, N'K07_O301', 0, null, 0, null), 
     (N'K07_O270', N'T', -1, N'K07_O300', 0, null, 0, null), 
     (N'K07_O271', N'T', -1, N'K07_O301', 0, null, 0, null), 
     (N'K07_O280', N'T', -1, N'K07_O300', 0, null, 0, null), 
     (N'K07_O281', N'T', -1, N'K07_O301', 0, null, 0, null), 
     (N'K07_O300', N'U', 0, null, 0, null, 0, null), 
     (N'K07_O301', N'U', 0, null, 0, null, 0, null), 
     (N'K07_O430', N'U', 1, N'K07_O455', 0, null, 0, null), 
     (N'K07_O435', N'U', 1, N'K07_O455', 0, null, 0, null), 
     (N'K07_O440', N'U', 1, N'K07_O455', 0, null, 0, null), 
     (N'K07_O445', N'U', 1, N'K07_O455', 0, null, 0, null), 
     (N'K07_O450', N'U', 1, N'K07_O455', 0, null, 0, null), 
     (N'K07_O455', N'U', 0, null, 0, null, 0, null), 
     (N'K07_O520', N'U', 1, N'K07_O545', 0, null, 0, null), 
     (N'K07_O525', N'U', 1, N'K07_O545', 0, null, 0, null), 
     (N'K07_O530', N'U', 1, N'K07_O545', 0, null, 0, null), 
     (N'K07_O535', N'U', 1, N'K07_O545', 0, null, 0, null), 
     (N'K07_O540', N'U', 1, N'K07_O545', 0, null, 0, null), 
     (N'K07_O545', N'U', 0, null, 0, null, 0, null), 
     (N'K07_O710', N'U', 1, N'K07_O760', 0, null, 0, null), 
     (N'K07_O720', N'U', 1, N'K07_O760', 0, null, 0, null), 
     (N'K07_O730', N'U', 1, N'K07_O760', 0, null, 0, null), 
     (N'K07_O740', N'U', 1, N'K07_O760', 0, null, 0, null), 
     (N'K07_O750', N'U', 1, N'K07_O760', 0, null, 0, null), 
     (N'K07_O760', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P091', N'U', -1, N'K07_P251', 1, N'K07_O091', 0, null), 
     (N'K07_P091US', N'U', -1, N'K07_P251US', 0, null, 0, null), 
     (N'K07_P101', N'U', 1, N'K07_P1010', 1, N'K07_PP101', 0, null), 
     (N'K07_P115', N'U', 1, N'K07_O115', 1, N'K07_P200', 0, null), 
     (N'K07_P116', N'U', 1, N'K07_O116', 1, N'K07_P200', 0, null), 
     (N'K07_P117', N'U', 1, N'K07_O117', 1, N'K07_P200', 0, null), 
     (N'K07_P118', N'U', 1, N'K07_O118', 1, N'K07_P200', 0, null), 
     (N'K07_P120', N'U', 1, N'K07_O120', 1, N'K07_P202', 0, null), 
     (N'K07_P120US', N'U', 0, null, 1, N'K07_P202US', 0, null), 
     (N'K07_P200', N'U', 1, N'K07_P250', 0, null, 0, null), 
     (N'K07_P202', N'U', 1, N'K07_P251', 0, null, 0, null), 
     (N'K07_P202US', N'U', 1, N'K07_P251US', 0, null, 0, null), 
     (N'K07_P250', N'U', 1, N'K07_P300', 0, null, 0, null), 
     (N'K07_P251', N'U', 1, N'K07_P301', 0, null, 0, null), 
     (N'K07_P251US', N'U', 1, N'K07_P301US', 0, null, 0, null), 
     (N'K07_P270', N'T', -1, N'K07_P300', 1, N'K07_O270', 0, null), 
     (N'K07_P271', N'T', -1, N'K07_P301', 1, N'K07_O271', 0, null), 
     (N'K07_P271US', N'T', -1, N'K07_P301US', 0, null, 0, null), 
     (N'K07_P280', N'T', -1, N'K07_P300', 1, N'K07_O280', 0, null), 
     (N'K07_P281', N'T', -1, N'K07_P301', 1, N'K07_O281', 0, null), 
     (N'K07_P281US', N'T', -1, N'K07_P301US', 0, null, 0, null), 
     (N'K07_P300', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P301', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P301US', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P430', N'U', 1, N'K07_O430', 1, N'K07_P455', 0, null), 
     (N'K07_P435', N'U', 1, N'K07_O435', 1, N'K07_P455', 0, null), 
     (N'K07_P440', N'U', 1, N'K07_O440', 1, N'K07_P455', 0, null), 
     (N'K07_P445', N'U', 1, N'K07_O445', 1, N'K07_P455', 0, null), 
     (N'K07_P450', N'U', 1, N'K07_O450', 1, N'K07_P455', 0, null), 
     (N'K07_P455', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P489US', N'T', 0, null, 0, null, 0, null), 
     (N'K07_P520', N'U', 1, N'K07_O520', 1, N'K07_P545', 0, null), 
     (N'K07_P521US', N'T', 0, null, 0, null, 0, null), 
     (N'K07_P525', N'U', 1, N'K07_O525', 1, N'K07_P545', 0, null), 
     (N'K07_P530', N'U', 1, N'K07_O530', 1, N'K07_P545', 0, null), 
     (N'K07_P535', N'U', 1, N'K07_O535', 1, N'K07_P545', 0, null), 
     (N'K07_P540', N'U', 1, N'K07_O540', 1, N'K07_P545', 0, null), 
     (N'K07_P545', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P710', N'U', 1, N'K07_O710', 1, N'K07_P760', 0, null), 
     (N'K07_P710US', N'U', 1, N'K07_P760US', 0, null, 0, null), 
     (N'K07_P720', N'U', 1, N'K07_O720', 1, N'K07_P760', 0, null), 
     (N'K07_P720US', N'U', 1, N'K07_P760US', 0, null, 0, null), 
     (N'K07_P730', N'U', 1, N'K07_O730', 1, N'K07_P760', 0, null), 
     (N'K07_P740', N'U', 1, N'K07_O740', 1, N'K07_P760', 0, null), 
     (N'K07_P750', N'U', 1, N'K07_O750', 1, N'K07_P760', 0, null), 
     (N'K07_P760', N'U', 0, null, 0, null, 0, null), 
     (N'K07_P760US', N'U', 0, null, 0, null, 0, null), 
     (N'K07_PA101', N'U', -1, N'K07_PP101', 0, null, 0, null), 
     (N'K07_PP101', N'U', 0, null, 0, null, 0, null); 

Моей попыткой была теперь получить вложенную иерархию с несколькими соединениями. Но это не похоже на трюк.

with Hierarchy(AccountNumber, ParentsPaths) 
      as (
       select ad1.AccountNumber, 
         cast(N'' as nvarchar(max)) 
       from  @AccountDefinitions as ad1 
       where  ad1.SumAccount1 is null 
       union all 
       select ad2.AccountNumber, 
         cast(case when h.ParentsPaths = N'' 
            then (cast(ad2.AccountNumber as nvarchar(max))) 
            else (h.ParentsPaths + '.' 
             + cast(ad2.AccountNumber as nvarchar(max))) 
          end as nvarchar(max)) 
       from  @AccountDefinitions as ad2 
       inner join Hierarchy as h 
         on h.AccountNumber = ad2.SumAccount1 
          or h.AccountNumber = ad2.SumAccount2 
          or h.AccountNumber = ad2.SumAccount3 
       where  ad2.SumAccount1 is not null 
      ) 
    select * 
    from Hierarchy 
    order by len(ParentsPaths) desc 
option (maxrecursion 0) 

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

Пример: для K07_1000 существует только один возможный путь: K07_1000 добавляет K07_O100, который добавляется до K07_O200 и, наконец, заканчивается на K07_O250. Для того, чтобы иметь возможность присоединиться к этому, я должен был бы результат:

Original | Mapped 
------------------- 
K07_1000 | K07_1000 <-- preserve the original posting 
K07_1000 | K07_O100 <-- the one and only path 
K07_1000 | K07_O200 
K07_1000 | K07_O250 
K07_1000 | K07_O300 

Если я присоединяюсь эту таблицу на столе бронирования, то я хотел бы получить в течение одного заказа на счет K07_1000 четыре результирующие заказы: оригинал и еще три (что добавит к суммированным родительским учетным записям).

Для учетной записи K07_1010 было бы сложнее, так как он может принимать четыре разных пути.

Original | Mapped 
------------------- 
K07_1010 | K07_1010 <-- the original posting 
K07_1010 | K07_100 <-- first possible path 
K07_1010 | K07_1000 
K07_1010 | K07_O100 
K07_1010 | K07_O200 
K07_1010 | K07_O250 
K07_1010 | K07_O300 
K07_1010 | K07_101P <-- second possible path 
K07_1010 | K07_O101 
K07_1010 | K07_O202 
K07_1010 | K07_O251 
K07_1010 | K07_O301 
K07_1010 | K07_C130 <-- third possible path 
K07_1010 | K07_C155 <- third path with sub path 1 
K07_1010 | K07_C630 <- third path with sub path 2 
K07_1010 | K07_C655 <- third path with sub path 2 

Надеюсь, это имеет смысл, и кто-то может помочь.

+0

Можете ли вы добавить выходные данные, например K07_1000 и K07_1010? –

+0

Спасибо за предложение добавить примеры результатов. Извините, я об этом не думал. Я изменил вопрос, чтобы добавить два упомянутых вами примера. Уверенная надежда это делает ее более ясной. – Ralph

+0

1. K07_1010 -> K07_C130 -> K07_C155 почему это не в вашем результате? 2. K07_1010 -> K07_100 почему это не в результате? 3. K07_1010 -> K07_101P -> K07_O202 -> K07_O251 -> K07_O301 также не является результатом. 4. K07_1010 -> K07_100 -> K07_1000 -> K07_O100 -> K07_O200 -> K07_O250 -> K07_O300 это также –

ответ

1

Ralph, попробуйте это. Я думаю, что он работает:

with Hierarchy 
      as (
       select ad1.AccountNumber, 
         SumAccount1, 
         SumAccount2, 
         SumAccount3 
       from  @AccountDefinitions as ad1 

       union all 

       select h.AccountNumber, 
         ad2.SumAccount1, 
         ad2.SumAccount2, 
         ad2.SumAccount3 
       from  @AccountDefinitions as ad2 
       inner join Hierarchy as h 
         on h.SumAccount1 = ad2.AccountNumber 
         or h.SumAccount2 = ad2.AccountNumber 
         or h.SumAccount3 = ad2.AccountNumber 
      ), 

cter 
    as(
    SELECT AccountNumber, AccountNumber AS SumAccount FROM @AccountDefinitions 

    UNION 

    select AccountNumber, 
      SumAccount1 as SumAccount 
    from Hierarchy 
    where SumAccount1 is not null 

    union 

    select AccountNumber, 
      SumAccount2 as SumAccount 
    from Hierarchy 
    where SumAccount2 is not null 

    union 

    select AccountNumber, 
      SumAccount3 as SumAccount 
    from Hierarchy 
    where SumAccount3 is not null) 

select * from cter 
WHERE AccountNumber = 'K07_1010' 
option (maxrecursion 0) 
+0

Георгий, большое спасибо за ваш ответ. Я провел некоторое тестирование, и, похоже, он отлично работает, несмотря на очевидную перезагрузку учетной записи K07_1010. Я буду проверять еще немного завтра без этого ограничения (а также добавить исходное отображение K07_1010 в K07_1010, похоже, тоже отсутствует). Но это всего лишь незначительные вещи. Самое главное, что вы смогли взломать его, и это абсолютно великолепно. Спасибо. Итак, я сделаю еще несколько проверок и после проверки отметьте это как ответ. – Ralph

+0

@Ralph, я добавил еще один союз для K07_1010. –

+0

После нескольких проверок я могу сказать, что он работает как ожидалось. Еще раз спасибо! – Ralph

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