K
Given data:
DECLARE @Table1 table
(
TeacherID integer NOT NULL,
ImageName varchar(20) NOT NULL
);
DECLARE @Table2 table
(
TeacherID integer NOT NULL,
ImageName varchar(20) NOT NULL
);
INSERT @Table1
(TeacherID, ImageName)
VALUES
(341, '10.jpeg'),
(341, '20.jpeg'),
(341, '30.jpeg'),
(734, '40.jpeg'),
(734, '50.jpeg'),
(734, '60.jpeg');
INSERT @Table2
(TeacherID, ImageName)
VALUES
(341, '1.jpeg'),
(341, '2.jpeg'),
(734, '3.jpeg'),
(734, '4.jpeg');
The basic idea is:
WITH
CombinedData AS
(
-- Get data from both sources
SELECT T1.TeacherID, T1.ImageName
FROM @Table1 AS T1
UNION ALL
SELECT T2.TeacherID, T2.ImageName
FROM @Table2 AS T2
),
ImageNumbers AS
(
-- Extract just the numbers from the ImageName
-- for ordering purposes next
SELECT
CD.TeacherID,
CD.ImageName,
ImageNumber = CONVERT(integer,
REPLACE(CD.ImageName, '.jpeg', ''))
FROM CombinedData AS CD
),
NumberedRows AS
(
-- Number the rows for each TeacherID
-- in ImageNumber order
-- These will be column numbers after the pivot
SELECT
I.TeacherID,
I.ImageName,
RowNum = ROW_NUMBER() OVER (
PARTITION BY I.TeacherID
ORDER BY I.ImageNumber)
FROM ImageNumbers AS I
)
-- Pivot the data
SELECT
P.TeacherID,
Image1 = P.[1],
Image2 = P.[2],
Image3 = P.[3],
Image4 = P.[4],
Image5 = P.[5]
FROM NumberedRows
PIVOT
(
MAX(ImageName)
FOR RowNum IN ([1], [2], [3], [4], [5])
) AS P;
Results:
TeacherID
Image1
Image2
Image3
Image4
Image5
341
1.jpeg
2.jpeg
10.jpeg
20.jpeg
30.jpeg
734
3.jpeg
4.jpeg
40.jpeg
50.jpeg
60.jpeg
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=8f13a1d6fcc49e56e1ef8dcd800639c5
If you need a dynamic pivot because you don't know in advance how many columns there will be, see:
https://dba.stackexchange.com/q/63698/1192
https://dba.stackexchange.com/q/31760/1192