表格列水平重复并显示值

时间:2015-12-22 09:40:23

标签: sql sql-server

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中是否可以按上述方式返回数据?

2 个答案:

答案 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