Как я могу программно создать плоскую родительскую дочернюю таблицу из буквенно-цифрового диапазона?

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

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

Я предполагаю, что Peoplesoft использует ASCii для упорядочивания возможных символов, но могу ошибаться.

Кто-нибудь знает достаточно быстрый способ сделать то, что мне нужно?

Текущий формат данных:

SETID,SETCNTRLVALUE,TREE_NAME,EFFDT,TREE_NODE_NUM,RANGE_FROM,RANGE_TO,TREE_BAANCH,DYNAMIC_RANGE,OLD_TREE_NODE_NUM,LEAF_IMAGE
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499992131,Z870,Z870, ,N,N, 
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499992131,Z880,Z880, ,N,N, 
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499992131,Z881,Z881, ,N,N, 
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499999761,Z850,Z850, ,N,N, 
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499999761,Z950,Z950, ,N,N, 
AAAS10, ,S_DEPTS,2016-04-05 00:00:00.000,1499999761,Z951,Z999, ,N,N, 

Требуемый формат вывода:

1499992131,Z870
1499992131,Z880
1499992131,Z881 
1499999761,Z850
1499999761,Z950
1499999761,Z951
1499999761,Z952
1499999761,Z953
...
1499999761,Z998
1499999761,Z999

TREE_NODE_NUM, ЛИСТ

Вероятно, стоит отметить, что поля from и to могут принимать любую форму и на них нельзя полагаться как на a1234 и т. д.


person user2916488    schedule 04.07.2016    source источник
comment
В PeopleSoft есть утилита для выравнивания дерева, которая помещает дерево в денормализованную таблицу для составления отчетов. Возможно, вам будет проще получить желаемые результаты, используя эту таблицу. Я считаю, что это будет показывать только действительные отделы в диапазоне. Например, если диапазон равен 1-5, а в таблице отделов находятся только отделы 2 и 4, в таблице с плоским деревом будут записи только для 2 и 4.   -  person Darryls99    schedule 04.07.2016
comment
Я попробовал инструмент для сглаживания деревьев, но, к сожалению, он не увенчался успехом. Я думаю, что это может быть то, что нам нужно.   -  person user2916488    schedule 06.07.2016


Ответы (1)


Я использую UDF для создания динамических диапазонов, но числа (или подсчеты) также помогут.

Подзапрос генерирует ВСЕ комбинации [A-Z] и [000-999] или 26 000 строк. Опять же, у вас может быть таблица букв [AZ] и таблица чисел [000-999]. Затем вы можете (как подзапрос)

Select Letter+Padded_Number from Letters A Join Numbers B on 1=1

Пример данных и пример запроса

Declare @Table table (Tree_Node_Num varchar(25),Range_From varchar(25),Range_To varchar(25))
Insert Into @Table values 
('1499992131','Z870','Z870'),
('1499992131','Z880','Z880'),
('1499992131','Z881','Z881'),  
('1499999761','Z850','Z850'),
('1499999761','Z951','Z999')

Select Distinct 
       Tree_Node_Num
      ,NewStr
From  @Table A
Join (
        Select NewStr=Alpha+PadNum
         From (Select Cntr=cast(RetVal as int),PadNum=format(RetVal,'000') from [dbo].[udf-Create-Range-Number](0,999,1)) A
         Join (Select RetVal,Alpha=char(RetVal) from [dbo].[udf-Create-Range-Number](65,90,1)) B
           on 1=1
     ) B
 On B.NewStr Between A.Range_From and A.Range_To
 Order by 1,2

Возвращает

Tree_Node_Num   NewStr
1499992131      Z870
1499992131      Z880
1499992131      Z881
1499999761      Z850
1499999761      Z951
1499999761      Z952
1499999761      Z953
...
1499999761      Z997
1499999761      Z998
1499999761      Z999

UDF, на всякий случай, но опять же, числовая/подсчетная таблица также поможет.

CREATE FUNCTION [dbo].[udf-Create-Range-Number] (@R1 money,@R2 money,@Incr money)

-- Syntax Select * from [dbo].[udf-Create-Range-Number](0,100,2)

Returns 
@ReturnVal Table (RetVal money)

As
Begin
    With NumbTable as (
        Select NumbFrom = @R1
        union all
        Select nf.NumbFrom + @Incr
        From NumbTable nf
        Where nf.NumbFrom < @R2
    )
    Insert into @ReturnVal(RetVal)

    Select NumbFrom from NumbTable Option (maxrecursion 32767)

    Return
End
person John Cappelletti    schedule 04.07.2016
comment
Предполагает ли это, что формат всегда состоит из 3 цифр с префиксом в виде буквы? к сожалению, это не относится к реальным данным, а только к примеру, который я привел выше. В некоторых случаях есть 8 символов... так что количество комбинаций будет огромным? - person user2916488; 06.07.2016
comment
Достаточно легко настроить. Возможно, вы должны были опубликовать более репрезентативный пример - person John Cappelletti; 06.07.2016