Friday, October 7, 2016

Horizontal Pivoting with Transformer stage in datastage

Datastage Realtime Scenario:

Requirement: When you have source data in multiple columns and you may need to make it as Horizontal. i.e., Reformat the data in multiple rows as given in the below example.

Example : Input    - 
                Table name - Student_Marks   
                 Name, Course1,Course2,Course3
                 John,23,34,56
                 Daniel, 45,23,63
                 Damian,45,34,576
                 
                 Output
                 Name,Course
                 John,23
                 John,34
                 John,56
                 Daniel,45
                 Daniel,23
                 Daniel,63
                 Damian,45
                 Damian,34
                 Damian,576  
        
Solution:

To fullfil the above requirement we can go for oracle query or can design a solution in Datastage with pivot stage or Transformer stage.

Oracle Query(11g Onwards only):
                      Select * from Student_Marks
                      UNPIVOT include NULLS (Course  for Course_Marks in 
                      (Course1 as 'C1' , Course2 as 'C2' , Course3 as 'C3' ) );

Datastage Design: 
                      Next to the source data read stage(seqntial/database stage), place a transformer                         stage and do the following piece of code in it.       

                                            Loop Condition
                                 Loop While : @ITERATION<=3

                      1. If @ITERATION=1 Then DSLink3.course1 
                          Else If  @ITERATION=2 Then DSLink3.course2          LoopVar
                          Else DSLink3.course3

                                               Derivation
                     1. DSLink3.Name           ----->                Name
                     2. LoopVar                      ----->                Course




Please send me email /post if any questions.










      




Wednesday, October 5, 2016

Adding Thousand separator in number field in Datastage

Datastage Realtime Scenario:

Requirement: When you have output field contains currency data and would need to put comma(,) as thousand separator.

Example : Input        -     Output
                  879769    -      879,769
                  123          -      123
                  3543543  -      3,543,543
                  23            -       23
Solution:

To fullfil the above requirement we can go for 2 design solutions.

   1. Create a parallel routine in cpp and call the function in Transformer stage.
     
        #include <iostream>
        #include <string>
        using namespace std;
        string AddCommas(char* a)
         {
           string numWithCommas = to_string(a);
            int insertPosition = numWithCommas.length() - 3;
            while (insertPosition > 0) {
               string b = numWithCommas.insert(insertPosition, ",");
      insertPosition-=3;}
            return b;
           }

   2. By using stage variable, Loop Condition in Transformer stage

                                                                Stage Variables

           1. Len(Inputcolumn)                                                                 =   Stglen
           2. If Stglen<=3 then 1 Else If Mod(Stglen,3)=0                       =   Stgnocommas
               Then  Len(Inputcolumn)/3-1 Else  Len(Inputcolumn)/3


                                                               Loop Condition

                                             Loop While : @ITERATION<=Stgnocommas

            1. If (@ITERATION=1 and Stglen<=3) then Inputcolumn Else      
                If @ITERATION=1 Then Left(Inputcolumn, Stglen-
                (3*@ITERATION)) :",":Right(Inputcolumn, 3* @ITERATION)           = LoopVar
                Else Left(LoopVar, Stglen-(3* @ITERATION)):",":
                Right(LoopVar, (@ITERATION-1)+(3* @ITERATION))          


                 
                                                                     Derivation

                                             Constaint : @ITERATION=Stgnocommas

             1.       LoopVar    =      Numwth_commas