This question already has answers here:
Closed 3 years ago.
Let's assume I have a table with the following rows and columns
EmpCode Empname Goals
------- ---- ------
101 kiran readsql
101 kiran coding
101 kiran readcss
102 rohit coding
102 rohit readjava
103 pradi do nothing
I want to display above table in below format:
EmpCode Empname Goal1 Goal2 Goal3
------- ---- ------ ------ ------
101 kiran readsql coding readcss
101 rohit coding readjava
103 pradi do nothing
The field goals is dynamic, please help me out. Thank you.
CREATE TABLE #tt(id INT IDENTITY(1,1) PRIMARY KEY,EmpCode INT,Empname VARCHAR(2566),Goals VARCHAR(256));
INSERT INTO #tt(EmpCode,Empname,Goals)VALUES
(101,'kiran','readsql'),
(101,'kiran','coding'),
(101,'kiran','readcss'),
(102,'rohit','coding'),
(102,'rohit','readjava'),
(103,'pradi','do nothing');
DECLARE @goal_cols NVARCHAR(MAX)=STUFF((
SELECT DISTINCT N',Goal'+CAST(ROW_NUMBER()OVER(PARTITION BY empcode ORDER BY id) AS VARCHAR(3))
FROM #tt
FOR XML PATH('')
),1,1,''
);
DECLARE @stmt NVARCHAR(MAX)=N'
SELECT *
FROM (
SELECT
EmpCode,Empname,Goals,
goal_id=''Goal''+CAST(ROW_NUMBER()OVER(PARTITION BY empcode ORDER BY id) AS VARCHAR(3))
FROM
#tt
) AS s
PIVOT(MAX(Goals) FOR goal_id IN ('+@goal_cols+')) AS p
ORDER BY EmpCode;';
EXECUTE sp_executesql @stmt;
DROP TABLE #tt;
Result:
+---------+---------+------------+----------+---------+
| EmpCode | Empname | Goal1 | Goal2 | Goal3 |
+---------+---------+------------+----------+---------+
| 101 | kiran | readsql | coding | readcss |
| 102 | rohit | coding | readjava | NULL |
| 103 | pradi | do nothing | NULL | NULL |
+---------+---------+------------+----------+---------+