1 vtable.pivot
Añade registros a una tabla virtual.
<vtable.pivot
name='name'
pivotcolumns='pivotcolumns'
datacolumns='datacolumns'
datalabels='datalabels'
measures-in-rows='measures-in-rows'
group-measures='group-measures'
clear-group='clear-group'
prefix='prefix'
pivotsort='pivotsort'
>
<var /> ?
</vtable.pivot>
Attributes | |||||
---|---|---|---|---|---|
Name | Type | Required | Default | Description | |
Aname | string | Nombre de la tabla virtual. La tabla virtual se puede indicar mediante este atributo o bien puede pasarse como un argumento. | |||
Apivotcolumns | string | Columna/s (separados por comas) que contiene los valores que serán los nombres las nuevas columnas en el resultado de la nueva matriz pivotada.Si se indica más de una valor, los nombres de la columnas resultantes (tantas como combinaciones de valores haya) será la concatenación de los valores separados por un espacio. | |||
Adatacolumns | string | Columna que contiene los valores numéricos a mostrar para cada columna de pivot | |||
Adatalabels | string | Permite indicar la lista de etiquetas separadas por coma con la que se nombrará a las distintas columnas de datos (datacolumns). | |||
Ameasures-in-rows | boolean | Indica que las filas contienen medidas. | |||
Agroup-measures | boolean | Permite que la lista de valores indicados en datacolumns, aparezca agrupada para cada combinación de pivotcolumns. | |||
Aclear-group | boolean | ||||
Aprefix | string | ||||
Apivotsort | string | Permite especificar en que orden aparecen las columnas pivotadas. Solo puede contener columnas indicadas en el atributo pivotcolumns. Si necesita realizar una ordenación vertical de las columnas debería pasar el resultado de vtable.pivot a través de vtable.sort. |
Arguments | |||||
---|---|---|---|---|---|
Name | Type | Required | Unique | Nullable | Description |
Evar | vtable | Tabla virtual. Puede indicarse mediante el atributo name o bien pasarse como un argumento. |
Returns | |
---|---|
Type | Description |
Vtable | Retorna una nueva vtable con los datos agrupados según las columnas indicadas. |
Exceptions
traspose requires correlative columns in select
Las columnas de ruptura deben ser las primeras del cursor.
Remarks
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.
Rotación de una matriz por la columna product y cogiendo como valor numérico el valor de la columna units.
<xsql-script name='vtable_pivot'> <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> <!-- Result: +======+=======+=====+ |region|product|units| +======+=======+=====+ |USA |NIKE | 10| |USA |PUMA | 20| |USA |PUMA | 50| |USA |REEBOK | 15| |EUROPE|NIKE | 12| |EUROPE|PUMA | 15| |EUROPE|REEBOK | 22| +======+=======+=====+ --> <println> <vtable.pivot name='v' pivotcolumns='product' datacolumns='units' /> </println> <!-- Result: +========+=======+====+====+======+ |measures|country|nike|puma|reebok| +========+=======+====+====+======+ |units |USA | 10| 70| 15| |units |EUROPE | 12| 15| 22| +========+=======+====+====+======+ --> </body> </xsql-script>
Rotación de una matriz de datos creando tantas columnas como combinaciones de valores diferentes haya en la columnas country, state conteniendo el valor de la columna units.
<xsql-script name='vtable_pivot'> <body> <vtable name='v'> <column name='region' type='char' /> <column name='state' type='char' /> <column name='product' type='char' /> <column name='units' type='decimal' /> </vtable> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>NIKE</string> <string>10</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>MI</string> <string>NIKE</string> <string>12</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>AR</string> <string>PUMA</string> <string>20</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>PUMA</string> <string>50</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>REEBOK</string> <string>15</string> </vtable.insert> <vtable.insert name='v'> <string>EUROPE</string> <string>UK</string> <string>NIKE</string> <string>12</string> </vtable.insert> <vtable.insert name='v'> <string>EUROPE</string> <string>UK</string> <string>PUMA</string> <string>20</string> </vtable.insert> <vtable.insert name='v'> <string>EUROPE</string> <string>DE</string> <string>PUMA</string> <string>15</string> </vtable.insert> <vtable.insert name='v'> <string>EUROPE</string> <string>DE</string> <string>REEBOK</string> <string>22</string> </vtable.insert> <println> <v /> </println> <!-- Result: +=======+=====+=======+=====+ |country|state|product|units| +=======+=====+=======+=====+ |USA |OR |NIKE | 10| |USA |MI |NIKE | 12| |USA |AR |PUMA | 20| |USA |OR |PUMA | 50| |USA |OR |REEBOK | 15| |EUROPE |UK |NIKE | 12| |EUROPE |UK |PUMA | 20| |EUROPE |DE |PUMA | 15| |EUROPE |DE |REEBOK | 22| +=======+=====+=======+=====+ --> <println> <vtable.sort columns='product'> <vtable.pivot name='v' pivotcolumns='region, state' pivotsort='country' datacolumns='units' /> </vtable.sort> </println> <!-- Result: +========+=======+======+======+======+=========+=========+ |measures|product|usa |usa |usa |europe |europe | | | |or |mi |ar |uk |de | +========+=======+======+======+======+=========+=========+ |units |NIKE | 10| 12| | 12| | |units |PUMA | 50| | 20| 20| 15| |units |REEBOK | 15| | | | 22| +========+=======+======+======+======+=========+=========+ --> </body> </xsql-script>
Rotación de una matriz de datos por el campo store_country, mostrando los valores numéricos de grocery_sqft y store_sqft.
<xsql-script name='vtable_pivot'> <body> <vtable name='v'> <column name='store_country' type='char' /> <column name='store_state' type='char' /> <column name='store_type' type='char' /> <column name='grocery_sqft' type='decimal' /> <column name='store_sqft' type='decimal' /> </vtable> <vtable.insert name='v'> <string>Canada</string><string>BC</string> <string>Mid-SizeGrocery</string> <string>27463</string> <string>34452</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>DF</string> <string>DeluxeSupermarket</string> <null /> <null /> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>DF</string> <string>Mid-SizeGrocery</string> <string>22450</string> <string>36509</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Guerrero</string> <string>Supermarket</string> <string>17475</string> <string>23593</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Jalisco</string> <string>SmallGrocery</string> <string>15012</string> <string>24597</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Veracruz</string> <string>Supermarket</string> <string>26354</string> <string>34791</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Yucatan</string> <string>DeluxeSupermarket</string> <string>20141</string> <string>30797</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>DeluxeSupermarket</string> <string>21938</string> <string>30584</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>GourmetSupermarket</string> <string>16844</string> <string>23759</string> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>Mid-SizeGrocery</string> <string>30351</string> <string>38382</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>GourmetSupermarket</string> <string>15337</string> <string>23688</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>HeadQuarters</string> <null /> <null /> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>SmallGrocery</string> <string>15321</string> <string>22478</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>Supermarket</string> <string>14210</string> <string>23598</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>DeluxeSupermarket</string> <string>18670</string> <string>27694</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>Supermarket</string> <string>16232</string> <string>20319</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>DeluxeSupermarket</string> <string>22123</string> <string>33858</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>Mid-SizeGrocery</string> <null /> <null /> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>SmallGrocery</string> <string>22271</string> <string>28206</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>Supermarket</string> <string>59758</string> <string>91179</string> </vtable.insert> <println> <v /> </println> <!-- Result: +=============+===========+===================+============+==========+ |store_country|store_state|store_type |grocery_sqft|store_sqft| +=============+===========+===================+============+==========+ |Canada |BC |Deluxe Supermarket | 16418| 23112| |Canada |BC |Mid-Size Grocery | 27463| 34452| |Mexico |DF |Deluxe Supermarket | | | |Mexico |DF |Mid-Size Grocery | 22450| 36509| |Mexico |Guerrero |Supermarket | 17475| 23593| |Mexico |Jalisco |Small Grocery | 15012| 24597| |Mexico |Veracruz |Supermarket | 26354| 34791| |Mexico |Yucatan |Deluxe Supermarket | 20141| 30797| |Mexico |Zacatecas |Deluxe Supermarket | 21938| 30584| |Mexico |Zacatecas |Gourmet Supermarket| 16844| 23759| |Mexico |Zacatecas |Mid-Size Grocery | 30351| 38382| |USA |CA |Gourmet Supermarket| 15337| 23688| |USA |CA |HeadQuarters | | | |USA |CA |Small Grocery | 15321| 22478| |USA |CA |Supermarket | 14210| 23598| |USA |OR |Deluxe Supermarket | 18670| 27694| |USA |OR |Supermarket | 16232| 20319| |USA |WA |Deluxe Supermarket | 22123| 33858| |USA |WA |Mid-Size Grocery | | | |USA |WA |Small Grocery | 22271| 28206| |USA |WA |Supermarket | 59758| 91179| +=============+===========+===================+============+==========+ --> <println> <vtable.pivot name='v' pivotcolumns='store_country' datacolumns='grocery_sqft,store_sqft' /> </println> <!-- Result: +============+===========+==================+======+======+=====+ |measures |store_state|store_type |canada|mexico|usa | +============+===========+==================+======+======+=====+ |grocery_sqft|BC |Mid=SizeGrocery | 27463| | | |grocery_sqft|DF |DeluxeSupermarket | | | | |grocery_sqft|DF |Mid=SizeGrocery | | 22450| | |grocery_sqft|Guerrero |Supermarket | | 17475| | |grocery_sqft|Jalisco |SmallGrocery | | 15012| | |grocery_sqft|Veracruz |Supermarket | | 26354| | |grocery_sqft|Yucatan |DeluxeSupermarket | | 20141| | |grocery_sqft|Zacatecas |DeluxeSupermarket | | 21938| | |grocery_sqft|Zacatecas |GourmetSupermarket| | 16844| | |grocery_sqft|Zacatecas |Mid=SizeGrocery | | 30351| | |grocery_sqft|CA |GourmetSupermarket| | |15337| |grocery_sqft|CA |HeadQuarters | | | | |grocery_sqft|CA |SmallGrocery | | |15321| |grocery_sqft|CA |Supermarket | | |14210| |grocery_sqft|OR |DeluxeSupermarket | | |18670| |grocery_sqft|OR |Supermarket | | |16232| |grocery_sqft|WA |DeluxeSupermarket | | |22123| |grocery_sqft|WA |Mid=SizeGrocery | | | | |grocery_sqft|WA |SmallGrocery | | |22271| |grocery_sqft|WA |Supermarket | | |59758| |store_sqft |BC |Mid=SizeGrocery | 34452| | | |store_sqft |DF |DeluxeSupermarket | | | | |store_sqft |DF |Mid=SizeGrocery | | 36509| | |store_sqft |Guerrero |Supermarket | | 23593| | |store_sqft |Jalisco |SmallGrocery | | 24597| | |store_sqft |Veracruz |Supermarket | | 34791| | |store_sqft |Yucatan |DeluxeSupermarket | | 30797| | |store_sqft |Zacatecas |DeluxeSupermarket | | 30584| | |store_sqft |Zacatecas |GourmetSupermarket| | 23759| | |store_sqft |Zacatecas |Mid=SizeGrocery | | 38382| | |store_sqft |CA |GourmetSupermarket| | |23688| |store_sqft |CA |HeadQuarters | | | | |store_sqft |CA |SmallGrocery | | |22478| |store_sqft |CA |Supermarket | | |23598| |store_sqft |OR |DeluxeSupermarket | | |27694| |store_sqft |OR |Supermarket | | |20319| |store_sqft |WA |DeluxeSupermarket | | |33858| |store_sqft |WA |Mid=SizeGrocery | | | | |store_sqft |WA |SmallGrocery | | |28206| |store_sqft |WA |Supermarket | | |91179| +============+===========+==================+======+======+=====+ --> </body> </xsql-script>
Rotación de una matriz de datos ordenados por la columna date de forma ascendente y descendente.
<xsql-script name='vtable_pivot_sort'> <body> <vtable name='v2'> <column name='region' type='char' /> <column name='product' type='char' /> <column name='sales' type='decimal' /> <column name='date' type='date' /> </vtable> <vtable.insert name='v2'> <matrix date-format='dd-MM-yyyy'> {"USA ","NIKE ", "12", "01-01-2012" } {"USA ","PUMA ", "20", "03-01-2012"} {"USA ","PUMA ", "50", "04-01-2012"} {"CAN ","REEBOK ", "15", "05-01-2012"} {"MEX ","REEBOK ", "15", "02-01-2012"} </matrix> </vtable.insert> <println><v2/></println> <!-- Result +------+-------+-------+----------+ |region|product|sales |date | |char |char |decimal|date | +------+-------+-------+----------+ |USA |NIKE | 12|01-01-2012| |USA |PUMA | 20|03-01-2012| |USA |PUMA | 50|04-01-2012| |CAN |REEBOK | 15|05-01-2012| |MEX |REEBOK | 15|02-01-2012| +------+-------+-------+----------+ --> <println><vtable.pivot name='v2' pivotcolumns='date' pivotsort='date' datacolumns='sales' /></println> <!-- Result +------+-------+----------+----------+----------+----------+----------+ |region|product|pivot1 |pivot5 |pivot2 |pivot3 |pivot4 | |char |char |decimal |decimal |decimal |decimal |decimal | |<null>|<null> |sales |sales |sales |sales |sales | | | |01-01-2012|02-01-2012|03-01-2012|04-01-2012|05-01-2012| +------+-------+----------+----------+----------+----------+----------+ |USA |NIKE | 12| | | | | | |PUMA | | | 20| 50| | |CAN |REEBOK | | | | | 15| |MEX | | | 15| | | | +------+-------+----------+----------+----------+----------+----------+ --> <println><vtable.pivot name='v2' pivotcolumns='date' pivotsort='date desc' datacolumns='sales' /></println> <!-- Result +------+-------+----------+----------+----------+----------+----------+ |region|product|pivot4 |pivot3 |pivot2 |pivot5 |pivot1 | |char |char |decimal |decimal |decimal |decimal |decimal | |<null>|<null> |sales |sales |sales |sales |sales | | | |05-01-2012|04-01-2012|03-01-2012|02-01-2012|01-01-2012| +------+-------+----------+----------+----------+----------+----------+ |USA |NIKE | | | | | 12| | |PUMA | | 50| 20| | | |CAN |REEBOK | 15| | | | | |MEX | | | | | 15| | +------+-------+----------+----------+----------+----------+----------+ --> </body> </xsql-script>
1.1 datalabels
Use datalabels to show the defined label instead of column names.
<xsql-script name='vtable_pivot'> <body> <vtable name='v'> <column name='store_country' type='char' /> <column name='store_state' type='char' /> <column name='store_type' type='char' /> <column name='grocery_sqft' type='decimal' /> <column name='store_sqft' type='decimal' /> </vtable> <vtable.insert name='v'> <string>Canada</string> <string>BC</string> <string>Mid-SizeGrocery</string> <number>27463</number> <number>34452</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>DF</string> <string>DeluxeSupermarket</string> <number>0</number> <number>0</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>DF</string> <string>Mid-SizeGrocery</string> <number>22450</number> <number>36509</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Guerrero</string> <string>Supermarket</string> <number>17475</number> <number>23593</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Jalisco</string> <string>SmallGrocery</string> <number>15012</number> <number>24597</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Veracruz</string> <string>Supermarket</string> <number>26354</number> <number>34791</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Yucatan</string> <string>DeluxeSupermarket</string> <number>20141</number> <number>30797</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>DeluxeSupermarket</string> <number>21938</number> <number>30584</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>GourmetSupermarket</string> <number>16844</number> <number>23759</number> </vtable.insert> <vtable.insert name='v'> <string>Mexico</string> <string>Zacatecas</string> <string>Mid-SizeGrocery</string> <number>30351</number> <number>38382</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>GourmetSupermarket</string> <number>15337</number> <number>23688</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>HeadQuarters</string> <number>0</number> <number>0</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>SmallGrocery</string> <number>15321</number> <number>22478</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>CA</string> <string>Supermarket</string> <number>14210</number> <number>23598</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>DeluxeSupermarket</string> <string>18670</string> <string>27694</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>OR</string> <string>Supermarket</string> <string>16232</string> <string>20319</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>DeluxeSupermarket</string> <string>22123</string> <string>33858</string> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>Mid-SizeGrocery</string> <number>0</number> <number>0</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>SmallGrocery</string> <number>22271</number> <number>28206</number> </vtable.insert> <vtable.insert name='v'> <string>USA</string> <string>WA</string> <string>Supermarket</string> <number>59758</number> <number>91179</number> </vtable.insert> <!-- Result: +===========+==================+============+============+============+==========+==========+==========+ |store_state|store_type |Canada |Mexico |USA |Canada |Mexico |USA | | | |grocery_sqft|grocery_sqft|grocery_sqft|store_sqft|store_sqft|store_sqft| +===========+==================+============+============+============+==========+==========+==========+ |BC |Mid-SizeGrocery | 27.463| | | 34.452| | | |DF |DeluxeSupermarket | | 0| | | 0| | |DF |Mid-SizeGrocery | | 22.450| | | 36.509| | |Guerrero |Supermarket | | 17.475| | | 23.593| | |Jalisco |SmallGrocery | | 15.012| | | 24.597| | |Veracruz |Supermarket | | 26.354| | | 34.791| | |Yucatan |DeluxeSupermarket | | 20.141| | | 30.797| | |Zacatecas |DeluxeSupermarket | | 21.938| | | 30.584| | |Zacatecas |GourmetSupermarket| | 16.844| | | 23.759| | |Zacatecas |Mid-SizeGrocery | | 30.351| | | 38.382| | |CA |GourmetSupermarket| | | 15.337| | | 23.688| |CA |HeadQuarters | | | 0| | | 0| |CA |SmallGrocery | | | 15.321| | | 22.478| |CA |Supermarket | | | 14.210| | | 23.598| |OR |DeluxeSupermarket | | | 18.670| | | 27.694| |OR |Supermarket | | | 16.232| | | 20.319| |WA |DeluxeSupermarket | | | 22.123| | | 33.858| |WA |Mid-SizeGrocery | | | 0| | | 0| |WA |SmallGrocery | | | 22.271| | | 28.206| |WA |Supermarket | | | 59.758| | | 91.179| +===========+==================+============+============+============+==========+==========+==========+ --> <println> <vtable.pivot name='v' pivotcolumns='store_country' datacolumns='grocery_sqft,store_sqft' datalabels='Grocery,Store' /> </println> <!-- Result: +===========+==================+============+============+============+==========+==========+==========+ |store_state|store_type |Canada |Mexico |USA |Canada |Mexico |USA | | | |Grocery |Grocery |Grocery |Store |Store |Store | +===========+==================+============+============+============+==========+==========+==========+ |BC |Mid-SizeGrocery | 27.463| | | 34.452| | | |DF |DeluxeSupermarket | | 0| | | 0| | |DF |Mid-SizeGrocery | | 22.450| | | 36.509| | |Guerrero |Supermarket | | 17.475| | | 23.593| | |Jalisco |SmallGrocery | | 15.012| | | 24.597| | |Veracruz |Supermarket | | 26.354| | | 34.791| | |Yucatan |DeluxeSupermarket | | 20.141| | | 30.797| | |Zacatecas |DeluxeSupermarket | | 21.938| | | 30.584| | |Zacatecas |GourmetSupermarket| | 16.844| | | 23.759| | |Zacatecas |Mid-SizeGrocery | | 30.351| | | 38.382| | |CA |GourmetSupermarket| | | 15.337| | | 23.688| |CA |HeadQuarters | | | 0| | | 0| |CA |SmallGrocery | | | 15.321| | | 22.478| |CA |Supermarket | | | 14.210| | | 23.598| |OR |DeluxeSupermarket | | | 18.670| | | 27.694| |OR |Supermarket | | | 16.232| | | 20.319| |WA |DeluxeSupermarket | | | 22.123| | | 33.858| |WA |Mid-SizeGrocery | | | 0| | | 0| |WA |SmallGrocery | | | 22.271| | | 28.206| |WA |Supermarket | | | 59.758| | | 91.179| +===========+==================+============+============+============+==========+==========+==========+ --> </body> </xsql-script>