Trying to figure how to write a dynamic pivot sql statement. Where TEST_NAME
could have up to 12 different values (thus having 12 columns). Some of the VAL will be Int, Decimal, or Varchar data types. Most of the examples I have seen have some from of aggregate included. I am looking to for a straight value pivot.
Source Table
╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║ VAL ║
╠═══════════╬══════╬═══════╣
║ Test1 ║ 1 ║ 0.304 ║
║ Test1 ║ 2 ║ 0.31 ║
║ Test1 ║ 3 ║ 0.306 ║
║ Test2 ║ 1 ║ 2.3 ║
║ Test2 ║ 2 ║ 2.5 ║
║ Test2 ║ 3 ║ 2.4 ║
║ Test3 ║ 1 ║ PASS ║
║ Test3 ║ 2 ║ PASS ║
╚═══════════╩══════╩═══════╝
Desired Output
╔══════════════════════════╗
║ SBNO Test1 Test2 Test3 ║
╠══════════════════════════╣
║ 1 0.304 2.3 PASS ║
║ 2 0.31 2.5 PASS ║
║ 3 0.306 2.4 NULL ║
╚══════════════════════════╝
The
PIVOT
function requires an aggregation to get it to work. It appears that yourVAL
column is avarchar
so you will have to use either theMAX
orMIN
aggregate functions.If the number of tests is limited, then you can hard-code the values:
See SQL Fiddle with Demo.
In your OP, you stated that you will have an larger number of rows to turn into columns. If that is the case, then you can use dynamic SQL:
See SQL Fiddle with Demo.
Both versions will give the same result:
There is no any way to PIVOT without aggregating.
A workaround might be to ensure that the obligatory aggregation is only ever applied to a single record. In Excel for example the output could be:
where Row Labels includes at the bottom a column of cells with unique index numbers.