Skip to content

SPL:Static Transposition

esProcSPL edited this page Jul 31, 2024 · 1 revision

The transposition function is commonly presented in front-end such as reports, which transposes the queried data into a specific display layout. For example, row-to-column transposition, column-to-row transposition, and more complex dynamic transposition, etc. And static transposition means that the structure of the transposed table is determined in advance, and the target structure will not change dynamically according to the data.

1. Row-to-column transposition

As the name implies, this functionality is used to perform the transposition from row to column, that is, taking the values in the rows as the names of columns. In practice, the application of row-to-column transposition usually follows the grouping and aggregation operations. Through grouping, we process the data of rows in the column to be transposed into distinct values, and then display the values of rows as the names of the columns. In fact, the function of row-to-column transposition is to subdivide the aggregation result of one column into a number of more specific column aggregation results for a more intuitive display effect.

[e.g.1] According to the students’ grade table, query the highest grades of each subject in each class and display them by column. And some of the data are as follows:

CLASS STUDENTID SUBJECT SCORE
1 1 English 84
1 1 Math 77
1 1 PE 69
1 2 English 81
1 2 Math 80

The results are expected to be displayed in the following form:

CLASS MAX_MATH MAX_ENGLISH MAX_PE
1 97 96 97
2 97 96 97

The A.pivot() function is provided in SPL for transposition, and the default is row-to-column transposition.

The SPL script is:

A
1 =T("Scores.csv")
2 =A1.groups(CLASS,SUBJECT; max(SCORE):MAX_SCORE)
3 =A2.pivot(CLASS; SUBJECT, MAX_SCORE; "Math":"MAX_MATH", "English":"MAX_ENGLISH", "PE":"MAX_PE")

A1: import the students’ grade table from the file.

A2: group and aggregate the records to get the highest grade of each subject in each class.

A3: use the A.pivot() function to transpose the highest grade of each subject in each class from row to column.

2. Column-to-row transposition

In the opposite of row-to-column transposition, column-to-row transposition needs to generate a new row for each field to be transposed, and the field name or corresponding name is converted to the value of the new field, and the original field value is converted to the value of another new field.

[e.g.2] Generate a list of each medal based on the Olympic medal table. And some of the data are as follows:

Game Nation Gold Silver Copper
30 USA 46 29 29
30 China 38 27 23
30 UK 29 17 19
30 Russia 24 26 32
30 Korea 13 8 7

The results are expected to be displayed in the following form:

GAME NATION MEDAL_TYPE MEDALS
30 USA GOLD 46
30 USA SILVER 29
30 USA COPPER 29
30 China GOLD 38
30 China SILVER 27
30 China COPPER 23

The @r option of the A.pivot() function is used to transpose columns to rows.

The SPL script is:

A
1 =T("Olympic.txt")
2 =A1.pivot@r(GAME,NATION; MEDAL_TYPE, MEDALS; GOLD, SILVER, COPPER)

A1: import the Olympic medal table.

A2: use the A.pivot@r() function to transpose fields GOLD, SILVER, COPPER from columns to rows.

3. The mutual transposition between row and column

Sometimes we need to use the value of a row as the column name, and convert the column name to a field value.

[e.g.3] The sales table classified by sales channel is recorded according to the year and month. And some of the data are as follows:

YEAR MONTH ONLINE STORE
2020 1 2440 3746.2
2020 2 1863.4 448.0
2020 3 1813.0 624.8
2020 4 670.8 2464.8
2020 5 3730.0 724.5

To query the sales amount of each channel in every month, and the results are expected to be displayed in the following form:

CATEGORY 1 2 3
ONLINE 2440 1863.4 1813.0
STORE 3746.2 448.0 624.8

Logically, we first use the A.pivot@r() function to perform column-to-row transposition and then use the A.pivot() function to transpose rows to columns.

The SPL script is:

A
1 =T("MonthSales.csv").select(YEAR:2020)
2 =A1.pivot@r(YEAR,MONTH; CATEGORY, AMOUNT)
3 =A2.pivot(CATEGORY; MONTH, AMOUNT)

A1: import the sales table, and select the records of year 2020.

A2: use the A.pivot@r() function to perform column-to-row transposition, converting the channel type of data to the field value of CATAGORY. The results are as follows:

YEAR MONTH CATEGORY AMOUNT
2020 1 ONLINE 2440
2020 1 STORE 3746.2
2020 2 ONLINE 1863.4
2020 2 STORE 448.0
2020 3 ONLINE 1813.0
2020 3 STORE 624.8

A3: use the A.pivot() function to transpose the values of the month field to columns.

MonthSales.csv

Olympic.txt

Scores.csv

Clone this wiki locally