My Table Schema(表名是记录)
ID int,
Name Varchar(100)
看起来像
ID Name
1 Mahesh
2 Mahendra
3 Kirti
4 Jatin
我想将唱片显示如下
Name Name
Mahesh Mahendra
Kirti Jatin
在SQL Server中是否可以按上述方式返回数据?
答案 0 :(得分:1)
在SQL Server中是否可以按上述方式返回数据?
是的,可以做到。
您必须定义一条规则,该规则将用于确定将在第一列上显示哪些名称以及在第二列上显示哪些名称。
我们假设规则为:columnNumber = 2 - rowNumber % 2
,如果您只需要重复一次Name
,则该规则有效。换句话说,奇数行上的名称出现在名字列上,偶数行上的名字出现在第二列上。
with recordsWithRowNumbers as
(
select *
,ROW_NUMBER() over ( order by id ) as RowNumber
FROM records
),
oddRows AS
(
select * from recordsWithRowNumbers where RowNumber % 2 = 1
),
evenRows AS
(
select * from recordsWithRowNumbers where RowNumber % 2 = 0
)
SELECT o.Name as Name1,
e.Name as Name2
FROM oddRows o
left JOIN
evenRows e on e.RowNumber = o.RowNumber + 1
如果您想多次重复名称列,可以使用类似的方法。
Sql Fiddle:http://sqlfiddle.com/#!3/9eecb7/6416
答案 1 :(得分:0)
这应该在应用程序层中完成,但如果您坚持(可能是遗留系统),您可以添加ROW_NUMBER
并使用整数除法进行简单分组:
;WITH cte AS
(
SELECT *, rn = ROW_NUMBER() OVER(ORDER BY id)-1
FROM #tab
)
SELECT MAX(CASE WHEN rn % 2 = 0 THEN name END) AS Name1
,MAX(CASE WHEN rn % 2 = 1 THEN name END) AS Name2
FROM cte
GROUP BY rn /2;
的 LiveDemo
强>
此解决方案可以轻松转换为更多列:
;WITH cte AS
(
SELECT *, rn = ROW_NUMBER() OVER(ORDER BY id)-1
FROM #tab
)
SELECT MAX(CASE WHEN rn % 3 = 0 THEN name END) AS Name1
,MAX(CASE WHEN rn % 3 = 1 THEN name END) AS Name2
,MAX(CASE WHEN rn % 3 = 2 THEN name END) AS Name3
FROM cte
GROUP BY rn /3;
的 LiveDemo2
强>