Contents
We have a database table STAKEHOLDER as follows:
We are trying to group the table by CLASS and convert all columns to a same row. Below is the desired result set:
WITHย CTEย AS(
SELECT
ย ย ย ย ย ย ย ย ย ย ย ย UP.CLASS,
ย ย ย ย ย ย ย ย ย ย ย ย UP.NS || UP.RNย ASย NSR,
ย ย ย ย ย ย ย ย ย ย ย ย UP.VAL
FROM
ย ย ย ย ย ย ย ย ย ย ย ย (
ย ย ย ย ย ย ย ย ย ย ย ย SELECT
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ROW_NUMBERย ()
ย ย ย ย ย ย ย ย ย OVERย (
ย ย ย ย ย ย ย ย ย ย ย PARTITIONย BYย S.CLASS
ย ย ย ย ย ย ย ย ย ย ย ย ORDERย BY
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย S.CLASS) RN,
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย S.*
ย ย ย ย ย ย ย ย ย ย ย ย FROM
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย STAKEHOLDER S
ย ย ย ย ย ย ย ย ย ย ย ย ORDERย BY
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CLASS,
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย SID) SS
UNPIVOT (VALย FORย NSย INย (NAME, SID)) UP
)
SELECT
ย ย ย ย ย ย ย ย ย ย ย ย *
FROM
ย ย ย ย ย ย ย ย ย ย ย ย CTE
PIVOT(MAX(VAL)ย FORย NSRย INย ('NAME1'ย ASย NAME1,
ย ย ย ย ย ย ย ย ย ย ย ย 'SID1'ย ASย SID1,
ย ย ย ย ย ย ย ย ย ย ย ย 'NAME2'ย ASย NAME2,
ย ย ย ย ย ย ย ย ย ย ย ย 'SID2'ย ASย SID2,
ย ย ย ย ย ย ย ย ย ย ย ย 'NAME3'ย ASย NAME3,
ย ย ย ย ย ย ย ย ย ย ย ย 'SID3'ย ASย SID3))
This is not difficult if we handle it with our natural way of thinking. After grouping the table by CLASS, we convert NAME and SID columns into rows and create names commanding values to be converted to columns. Format of names is the original column name + number of subgroups, like NAME1, SID1, NAME2, SID2๏ผโฆ for group 1 and NAME1, SID1, โฆ for group2. Then we concatenate groups and transpose row to columns. The problem is SQL does not support dynamic row-to-column/column-to-row transposition. When the number of columns is small and columns are fixed, the language can mange to do the transpositions. As the number of columns increases, the scenario becomes more and more awkward. Enumerating all columns to be converted is complicated and SQL code becomes bloated. If columns are dynamic, SQL needs to turn to complex and roundabout ways to handle them.
Yet, it is really easy to code the transposition task with the open-source esProc SPL:
SPL is the specialized data computing engine that is based on ordered-sets. It offers the all-round abilities for performing set-oriented operations, supports stepwise coding, and provides intuitive solutions. Instead of enumerating columns, SPL can automatically scale up, making it convenient to deal with various transposition tasks.
[fluentform id="8"]