Nueva función XSQL-Script “vtable.pivot”

Java Code1

Nueva función XSQL-Script “vtable.pivot”

Impletación de una nueva función para programas XSQL-Script: vtable.pivot. Permite girar una matriz de datos, es decir, dado un conjunto de registros, retorna una matriz agrupando los valores por las columnas de ruptura indicados, pasando el valor de cada registro a una columna del agrupado.

La matriz inicial de datos puede ser construida a partir de un vtable o de un select a base de datos.
Cuando un valor de agrupación se repite y el valor para la columna es numérico, el resultado es la suma de los valores de cada registro para la misma entrada de agrupación.

Sintaxis y parámetros


La sintaxis del tag es la siguiente:

<vtable.pivot 
    name='vtable_name' 
    pivot='pivot_columns' 
    measures='measures_columns' />

Alternativamente se puede especificar la tabla virtual como el contenido del tag:

<vtable.pivot 
    pivot='pivot_columns' 
    measures='measures_columns'>
    <vtable_vriable/>
</vtable>

Los atributos “pivot” y “measures” que el tag acepta son usados de la siguiente forma:

  • pivot: columna que contiene los valores que serán los nombres las nuevas columnas en el resultado de la nueva matriz pivotada
  • measures: columna que contiene los valores numéricos a mostrar para cada columna de pivot

Ejemplo de funcionamiento


Para un conjunto de datos como el siguiente:

region product units
USA NIKE 10
USA PUMA 20
USA PUMA 50
USA REEBOK 15
EUROPE NIKE 12
EUROPE NIKE 12
EUROPE PUMA 15
EUROPE REEBOK 22

Así, al hacer la rotación por la columna “product” y measures “units” el resultado es el siguiente:

measures region nike puma reebok
units USA 10 70 15
units EUROPE 12 15 22

Al repetirse el valor de agrupación “USA|PUMA” para la columna numérica “PUMA” el resultado es la suma de los valores para la misma entrada de agrupación.

Ejemplo del programa XSQL-Script


El siguiente código muestra un ejemplo de XSQL-Script que realiza la rotación de una matriz de datos.

<xsql-script name='init'>
    <body>

        <vtable name='v'>
            <column name='region' type='char' />
            <column name='product' type='char' />
            <column name='units' type='decimal' />
        </vtable>
        <vtable.insert name='v'>
            <string>USA</string>
            <string>NIKE</string>
            <string>10</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>USA</string>
            <string>PUMA</string>
            <string>20</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>USA</string>
            <string>PUMA</string>
            <string>50</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>USA</string>
            <string>REEBOK</string>
            <string>15</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>EUROPE</string>
            <string>NIKE</string>
            <string>12</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>EUROPE</string>
            <string>PUMA</string>
            <string>15</string>
        </vtable.insert>
        <vtable.insert name='v'>
            <string>EUROPE</string>
            <string>REEBOK</string>
            <string>22</string>
        </vtable.insert>
    
        <println>
            <v />
        </println>
    
        <println>
            <vtable.pivot name='v' pivot='product' measures='units' />
        </println>
    
    </body>
</xsql-script>

Ejemplo de pivotar una vtable por más de una columna


El siguiente código muestra un ejemplo de XSQL-Script que realiza la rotación de una matriz de datos por 2 columnas.

<xsql-script name='init'>
    <body>

        <vtable name='v2'>
            <column name='country' type='char' />
            <column name='state' type='char' />
            <column name='product' type='char' />
            <column name='units' type='decimal' />
        </vtable>

        <vtable.insert name='v2'>
            <string>USA</string>
            <string>OR</string>
            <string>NIKE</string>
            <string>10</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>USA</string>
            <string>MI</string>
            <string>NIKE</string>
            <string>12</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>USA</string>
            <string>AR</string>
            <string>PUMA</string>
            <string>20</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>USA</string>
            <string>OR</string>
            <string>PUMA</string>
            <string>50</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>USA</string>
            <string>OR</string>
            <string>REEBOK</string>
            <string>15</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>EUROPE</string>
            <string>UK</string>
            <string>NIKE</string>
            <string>12</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>EUROPE</string>
            <string>UK</string>
            <string>PUMA</string>
            <string>20</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>EUROPE</string>
            <string>DE</string>
            <string>PUMA</string>
            <string>15</string>
        </vtable.insert>
        <vtable.insert name='v2'>
            <string>EUROPE</string>
            <string>DE</string>
            <string>REEBOK</string>
            <string>22</string>
        </vtable.insert>
    
        <println>
            <v2 />
        </println>
    
        <println>
            <vtable.pivot name='v2' pivot='country, state' measures='units' />
        </println>

    </body>
</xsql-script>