2016-07-04 4 views
0

J'ai extrait des données de hiérarchie d'une table PeopleSoft qui inclut des plages alphanumériques de et à pour les valeurs feuille. Je suppose que cela permet une entrée rapide, une prise tout et est raisonnablement optimale pour la consommation d'espace.Comment puis-je créer de manière progmatique une table enfant parent plate à partir d'une plage alphanumérique?

J'ai besoin de le décomposer pour avoir toutes les combinaisons dans un format plat. Si c'était simplement numérique, je pourrais juste boucler l'ensemble de données en ajoutant un de la borne supérieure à la borne inférieure, mais avec alpha-numérique, c'est plus difficile que cela.

Je suppose que Peoplesoft utilise ASCii pour ordonner les caractères possibles, mais pourrait être faux.

Est-ce que quelqu'un connaît une façon raisonnablement rapide de faire ce dont j'ai besoin?

format de données actuel:

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, 

format de sortie requis:

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

TREE_NODE_NUM, LEAF

Probablement la peine d'appeler que la provenance et à destination des champs peut prendre une forme quelconque et peut » t être invoqué pour être a1234 etc

+1

Il y a un tre L'utilitaire d'aplatissement dans PeopleSoft qui place l'arbre dans une table dénormalisée pour le reporting. Vous pourriez être en mesure d'obtenir les résultats que vous voulez plus facilement en utilisant cette table. Je crois que cela ne montrerait que des départements valides dans la gamme. Par exemple, si la plage est 1-5 et que seuls les rayons 2 et 4 sont dans la table des départements, la table arborescente n'affichera que les entrées 2 et 4. – Darryls99

+0

J'ai essayé l'outil d'aplatissement des arbres, mais malheureusement il ne fonctionne pas . Je pense que cela pourrait être ce dont nous avons besoin. – user2916488

Répondre

0

J'utilise un UDF pour créer r dynamique anges, mais un nombre (ou un nombre) fera aussi l'affaire

La sous-requête génère TOUTES les combinaisons de [A-Z] et [000-999] ou 26 000 lignes. Encore une fois, vous pourriez avoir une table de lettres [A-Z] et une table de nombres [000-999]. Ensuite, vous pouvez (comme la sous-requête)

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

données de l'échantillon et de l'échantillon de requête

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 

Retours

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

L'UDF, au cas où, mais encore une fois un nombre/tally la table fera aussi l'affaire

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 
+0

Est-ce que cela suppose que le format est toujours 3 chiffres préfixés avec une lettre? malheureusement ce n'est pas le cas avec les données réelles juste l'exemple que j'ai donné plus haut. Dans certains cas, il y a 8 caractères ... donc le nombre de combinaisons sera énorme? – user2916488

+1

Assez facile à régler. Peut-être que vous auriez dû poster un exemple plus représentatif –