-3

What I have:

VIEW A 
uid name
10   test1
20   test2
30   test3
40   test4

What I want:

ViewName  ColName Row Value   
View A    uid     1   10
View A    name    1   test1
View A    uid     2   20
View A    name    2   test2
Dale K
  • 25,246
  • 15
  • 42
  • 71
PassionateDeveloper
  • 14,558
  • 34
  • 107
  • 176

3 Answers3

2

You can assign row numbers in a CTE and then unpivot with UNION ALL.

Notes:

  • uid looks like an integer datatype while name is a string, so you need to convert uid to a VARCHAR else UNION ALL will raise an error.

  • obviously the ViewName is harcoded in the query to viewA

Query:

WITH cte AS (
    SELECT 'viewA' ViewName, uid, name, ROW_NUMBER() OVER(ORDER BY uid) rn FROM viewA
)
SELECT ViewName, 'uid' ColName, rn Row, CAST(uid AS varchar(50)) value FROM cte
UNION ALL SELECT ViewName, 'name' ColName, rn Row, name FROM cte
ORDER BY rn, ColName DESC

Demo on DB FIddle:

ViewName | ColName | Row | value
:------- | :------ | :-- | :------
viewA    | uid     | 1   | 10              
viewA    | name    | 1   | test1           
viewA    | uid     | 2   | 20              
viewA    | name    | 2   | test2           
viewA    | uid     | 3   | 30              
viewA    | name    | 3   | test3           
viewA    | uid     | 4   | 40              
viewA    | name    | 4   | test4           
GMB
  • 216,147
  • 25
  • 84
  • 135
0

you could use a union based on a subquery on view_A

select  'View A', 'uid' colname, row_num,  uid value
from (
SELECT 
  ROW_NUMBER() OVER(ORDER BY uid ASC) AS row_num, uid, name
from view_A

)
UNION ALL 
select  'View A', 'name', row_num,  name
from (SELECT 
  ROW_NUMBER() OVER(ORDER BY uid ASC) AS row_num, uid, name
from view_A)
ORDER BY row_num, colname
ScaisEdge
  • 131,976
  • 10
  • 91
  • 107
0

you can use this :

DECLARE @ViewName NVARCHAR(64) = 'ViewA'
DECLARE @Query NVARCHAR(MAX) = ''

SET @Query = ' 
SELECT  ' + '''' + @ViewName + + '''' + ' AS ViewName,
        C.[name] AS ColName,
        V.[name] AS [Value],
        DENSE_RANK() OVER( ORDER BY V.[Uid] ) AS [Row]
FROM    ' + @ViewName + ' AS V
        INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(' + '''' + @ViewName + '''' + ')'
        print @Query

EXECUTE SP_EXECUTESQL @Query
Pouya Kamyar
  • 133
  • 1
  • 9