你需要使用动态SQL来制作。
根据您的预期结果,您可以尝试按照这些步骤进行操作。
使用row_number函数按名称生成行号,因为我们需要join基于该行号。
获取使用MAX和MIN制作行号日历表。从 1 到 max(rn)。该表可以让使用outer join
声明一个 var @tables 以使 OUTER JOIN 执行 SQL(每个 LEFT JOIN 和一组 Crew#)。
声明一个 var @col 来创建列,您想从每个表中选择 (Employee)。
然后使用execute动态执行。
看起来像这样。
create table T
(
Name varchar(50),
Employee VARCHAR(50)
)
insert into T values ('Crew#1','TR123');
insert into T values ('Crew#1','311');
insert into T values ('Crew#2','DDD');
insert into T values ('Crew#2','12121');
insert into T values ('Crew#1','SDDAS');
insert into T values ('Crew#3','31114312');
insert into T values ('Crew#3','DD14124D');
insert into T values ('Crew#3','1214124121');
insert into T values ('Crew#3','SDD412AS');
DECLARE @tables AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@col AS NVARCHAR(MAX);
SET @tables = STUFF((SELECT distinct ' LEFT JOIN ' + ' (SELECT * FROM CTE WHERE Name = '''+Name+''') '+QUOTENAME(Name)+' on t1.smallRN = '+QUOTENAME(Name)+'.rn'
FROM T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @col = STUFF((SELECT distinct ', ' + QUOTENAME(Name)+'.Employee as '''+ QUOTENAME(Name) +''''
FROM T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @col = substring(@col,1, len(@col))
set @query = '
WITH CTE AS (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Name) rn
FROM T
),CTE1 AS(
SELECT MIN(rn) smallRN,MAX(rn) bigRN
FROM CTE
UNION ALL
SELECT smallRN+1,bigRN
FROM CTE1
WHERE smallRN < bigRN
)
SELECT '+@col+'
FROM CTE1 t1 ' + @tables
execute(@query)
sqlfiddle