Home Page for the TeradataForum
 

Archives of the TeradataForum

Message Posted: Mon, 10 Jul 2006 @ 17:34:15 GMT


     
  <Prev Next>   <<First <Prev Next> Last>>  


Subj:   Re: Converting Rows to coulmns by some Fucnction of teradata
 
From:   Dieter Noeth

I got an example from my trainings concatenating all column names of a table. Not simple, but quite fast (probably faster than a recursive query in V2R6). Depending on the data RANK has to be replaced by ROW_NUMBER:

     /*** Rows to concatenated string ***/
     /*** If the maximum number of rows is known (and small).
           Returns a single concatenated string consisting of up to 8
     rows***/
     sel
        databasename
       ,tablename
       ,max(case when rnk = 1 then        ColumnName else '' end) ||
        max(case when rnk = 2 then ',' || ColumnName else '' end) ||
        max(case when rnk = 3 then ',' || ColumnName else '' end) ||
        max(case when rnk = 4 then ',' || ColumnName else '' end) ||
        max(case when rnk = 5 then ',' || ColumnName else '' end) ||
        max(case when rnk = 6 then ',' || ColumnName else '' end) ||
        max(case when rnk = 7 then ',' || ColumnName else '' end) ||
        max(case when rnk = 8 then ',' || ColumnName else '' end) ||
     /*** Indicating more than 8 rows ***/
        max(case when rnk > 8 then ',...' else '' end) as Columns
     from
       (
        sel
          databasename
         ,tablename
         ,trim(columnName) as ColumnName
         ,rank() over (partition by databasename, tablename
                       order by columnid) as rnk
        from
          dbc.columns
        where databasename = 'dbc'
       ) dt
     group by 1,2
     order by 1,2
     ;


     /*** Rows to concatenated string ***/
     /*** If the maximum number of rows is unknown (or huge).
           Returns maybe several rows of concatenated strings per group***/
     sel
        databasename
       ,tablename
       ,trim(((rnk / 8) * 8) + 1 (format '999')) || ' to ' ||
        trim(((rnk / 8) + 1) * 8 (format '999')) as ColumnNumber
       ,max(case when rnk mod 8 = 0 then ColumnName else '' end) ||
        max(case when rnk mod 8 = 1 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 2 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 3 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 4 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 5 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 6 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 8 = 7 then ',' || ColumnName else '' end) as
     Columns
     from
       (
        sel
          databasename
         ,tablename
         ,trim(columnName) as ColumnName
         ,rank() over (partition by databasename, tablename
                       order by columnid) -1 as rnk
        from
          dbc.columns
        where databasename = 'dbc'
       ) dt
     group by 1,2,3
     order by 1,2,3
     ;


     /*** Rows to concatenated string ***/
     /*** Nested version instead of hundreds of CASEs.
           Returns a single concatenated string consisting of up to 2048
     columnnames ***/
     sel
        databasename
       ,tablename
       ,max(case when rnk mod 16 = 0 then ColumnName else '' end) ||
        max(case when rnk mod 16 = 1 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 2 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 3 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 4 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 5 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 6 then ',' || ColumnName else '' end) ||
        max(case when rnk mod 16 = 7 then ',' || ColumnName else '' end)
       as Columns
     from
       (
        sel
          databasename
         ,tablename
         ,rnk / 16 as rnk
         ,max(case when rnk mod 16 = 0 then ColumnName else '' end) ||
          max(case when rnk mod 16 = 1 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 2 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 3 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 4 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 5 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 6 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 7 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 8 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 9 then ',' || ColumnName else '' end) ||
          max(case when rnk mod 16 = 10 then ',' || ColumnName else '' end)
     ||
          max(case when rnk mod 16 = 11 then ',' || ColumnName else '' end)
     ||
          max(case when rnk mod 16 = 12 then ',' || ColumnName else '' end)
     ||
          max(case when rnk mod 16 = 13 then ',' || ColumnName else '' end)
     ||
          max(case when rnk mod 16 = 14 then ',' || ColumnName else '' end)
     ||
          max(case when rnk mod 16 = 15 then ',' || ColumnName else '' end)
     as ColumnName
        from
         (
          sel
            databasename
           ,tablename
           ,rnk / 16 as rnk
           ,max(case when rnk mod 16 = 0 then ColumnName else '' end) ||
            max(case when rnk mod 16 = 1 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 2 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 3 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 4 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 5 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 6 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 7 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 8 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 9 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 10 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 11 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 12 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 13 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 14 then ',' || ColumnName else '' end)
     ||
            max(case when rnk mod 16 = 15 then ',' || ColumnName else '' end)

     as ColumnName
          from
           (
            sel
              databasename
             ,tablename
             ,trim(columnName) as ColumnName
             ,rank() over (partition by databasename, tablename
                           order by columnid) -1 as rnk
            from
              dbc.columns
            where databasename = 'dbc'
           ) dt
          group by 1,2,3
         )dt
        group by 1,2,3
     ) dt
     group by 1,2
     ;

Dieter



     
  <Prev Next>   <<First <Prev Next> Last>>  
 
 
 
 
 
 
 
 
  
  Top Home Privacy Feedback  
 
 
Copyright for the TeradataForum (TDATA-L), Manta BlueSky    
Copyright 2016 - All Rights Reserved    
Last Modified: 15 Jun 2023