Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to transform rows into column in SQL Server?

Tags:

sql

sql-server

Using MS SQL Server and I have below table:

+-----------+------------------+------------------+---------------------+-------------------------+
| SrNo      |    ApprCode      |  ApprName        |     ApprStatus      |      ApprDate           |
+-----------+------------------+------------------+---------------------+-------------------------+
| SR_176    |   X001           |   James          |   APR               | 2019-10-03              |
| SR_176    |   X002           |   Sam            |   APR               | 2019-10-03              |
+-----------+------------------+------------------+---------------------+-------------------------+

Tried with PIVOT but its showing james and X001 as a column heading:

Expected Result:

+-----------+-------------- +---------------+---------------------+-------------------------+------------------+
    SrNo    | ApprCode_1    | ApprName_1    | ApprDate_2               ApprCode_2     ApprName_2     ApprDate_2  
+-----------+---------------+---------------+---------------------+-------------------------+------------------+
    SR_176     X001             James         2019-10-03               X002           Sam            2019-10-03
+-----------+---------------+---------------+---------------------+---- ---------------------+------------------+

Query to generate data:

CREATE TABLE #Temp
(
    SrNo NVARCHAR(200),
    ApprCode NVARCHAR(200),
    ApprName NVARCHAR(200),
    ApprDate Date
)

INSERT INTO #Temp VALUES ('SR_176','X001','James', '2019-10-03')
INSERT INTO #Temp VALUES ('SR_176','X002','Sam', '2019-10-03')

Query that I tried:

declare @sql nvarchar(max)
declare @name_concat nvarchar(max)
declare @name1_concat nvarchar(max)
declare @select_aggs nvarchar(max)
select @name_concat = STUFF((select distinct ',' + quotename(ApprCode) from #Temp order by 1 for xml path('')), 1, 1, '')
select @name1_concat = STUFF((select distinct ',' + quotename(ApprName) from #Temp order by 1 for xml path('')), 1, 1, '')

select @sql = '
;with cte2 as
(
    SELECT SrNo,' + @name_concat + ',' + @name1_concat + '
    FROM #Temp
    PIVOT(MAX(ApprCode)
          FOR ApprCode IN (' + @name_concat + ')) AS PVTTable PIVOT
          (
          MAX(ApprName)
          FOR ApprName IN (' + @name1_concat + ')) AS PVTTable1
)
select * from cte2
'
exec sp_executesql @sql
like image 597
Prashant Pimpale Avatar asked Aug 09 '26 19:08

Prashant Pimpale


1 Answers

In fact, This is not a SQL Pivot situation and the sample data for question is not enough to test it completely but you can find the main idea :

Select
    SrNo,
    MAX(IIF(ApprCode = 'X001', ApprCode, null)) as ApprCode_1,
    MAX(IIF(ApprCode = 'X001', ApprName, null)) as ApprName_1,
    MAX(IIF(ApprCode = 'X001', ApprDate, null)) as ApprDate_1,
    MAX(IIF(ApprCode = 'X002', ApprCode, null)) as ApprCode_2,
    MAX(IIF(ApprCode = 'X002', ApprName, null)) as ApprName_2,
    MAX(IIF(ApprCode = 'X002', ApprDate, null)) as ApprDate_2
From #Temp
Group by SrNo 

This code works if ApprCode was the key to make two separate columns & SrNo is for the group by between rows.

like image 192
XAMT Avatar answered Aug 11 '26 08:08

XAMT



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!