如何在SQL Server中水平显示数据?

时间:2016-05-20 04:38:30

标签: sql-server

如何水平显示表格数据?

这是我的表定义

create table [User]
(
    Id int primary key identity(1,1),
    Name varchar(50),
    Gender varchar(10)
)

这是我在SQL Server表中的数据

+====+=======+========+
| Id | Name  | Gender |
+====+=======+========+
| 1  | Fahad | Male   |
+----+-------+--------+
| 2  | Saad  | Male   |
+----+-------+--------+
| 3  | Asif  | Male   |
+====+=======+========+

我希望像这样水平显示它

+========+=======+======+======+
| Id     | 1     | 2    | 3    |
+========+=======+======+======+
| Name   | Fahad | Saad | Asif |
+--------+-------+------+------+
| Gender | Male  | Male | Male |
+========+=======+======+======+

4 个答案:

答案 0 :(得分:4)

也许是UNPIVOTPIVOT的组合?

(虽然您的列必须属于同一类型才能实现,但我在表格中进行了更改,或者您只能CAST / SELECT CTE等)

CREATE table [User](
Id int primary key identity(1,1),
Name varchar(50),
Gender varchar(50)
)

SET IDENTITY_INSERT [User] ON

INSERT INTO [User](Id,Name,Gender) VALUES 
(1, 'Fahad','Male'),
(2,'Saad','Male'),
(3,'Asif','Male')

SELECT * FROM [User]
UNPIVOT ([Value] FOR Cols IN ([Name],[Gender])) Unp
PIVOT   (MAX([Value]) FOR Id IN ([1],[2],[3])) Piv


Cols    1      2      3
------  ------ ------ -------
Gender  Male   Male   Male
Name    Fahad  Saad   Asif

(2 row(s) affected)

CASE也可用于实现相同的目标 - 在SO上有大量的例子。

编辑:优秀示例Simple way to transpose columns and rows in Sql? (这可能是这个问题的重复)

答案 1 :(得分:1)

是的,似乎我们可能需要对_M_transferUNPIVOT进行组合。

请尝试以下操作,它可能会为您提供您所期望的确切结果。请先改变你的设计

PIVOT

尝试以下,

Gender varchar(10) to Gender varchar(50)

答案 2 :(得分:0)

这是一个适用于任何给定表的存储过程。它假定表键位于第一列。

IF OBJECT_ID(N'[Invert]','P') IS NOT NULL 
    DROP PROCEDURE [Invert]
GO
CREATE PROCEDURE dbo.[Invert] @tbl sysname, @top int=1000 AS
DECLARE @key sysname SELECT @key=COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME=@tbl AND ORDINAL_POSITION=1
DECLARE @sql nvarchar(max), @ids varchar(max)
SET @sql='SELECT TOP '+CAST(@top as varchar(9))+' @out=COALESCE(@out+'','','''')+QUOTENAME('
    +QUOTENAME(@key)+') FROM '+QUOTENAME(@tbl)+' ORDER BY '+QUOTENAME(@key)
EXECUTE sp_executesql @sql, N'@out varchar(max) OUTPUT', @out=@ids OUTPUT
SET @sql=NULL
SELECT @sql=COALESCE(@sql+' UNION ALL ','')+'SELECT '''+COLUMN_NAME+''' AS '+QUOTENAME(@key)
    + ',* FROM (SELECT TOP '+CAST(@top as varchar(9))+' '+QUOTENAME(@key)+' k,CAST('
    + QUOTENAME(COLUMN_NAME)+'as varchar(8000)) m FROM '+QUOTENAME(@tbl)
    +' ORDER BY '+QUOTENAME(@key)+') t PIVOT (MAX(m) FOR k IN ('+@ids+')) x'+CHAR(13)
    FROM INFORMATION_SCHEMA.COLUMNS c WHERE TABLE_NAME=@tbl AND c.ORDINAL_POSITION>1
    ORDER BY c.ORDINAL_POSITION
EXECUTE(@sql)
GO

存储过程使用PIVOT来旋转每列。 UNPIVOT很好,但只有在所有列具有相同类型(包括长度)时才能使用。该过程生成一个动态SELECT,它使用UNION ALL运算符组合每列的PIVOT(键除外)。密钥值列表(@ids)也是动态生成的,因为PIVOT命令需要显式列列表。

然后你可以这样称呼它:

EXEC Invert [User]

第二个可选参数是top子句(默认值为1000)。下面是一个最多返回5行的示例:

EXEC Invert [User], 5

答案 3 :(得分:0)

create table [User]
(
    Id int primary key identity(1,1),
    Name varchar(50),
    Gender varchar(50),sal varchar(50)
)SET IDENTITY_INSERT [User] ON

--为所有字段赋予相同的数据类型和大小

    INSERT INTO [User](Id,Name,Gender,sal) VALUES 
    (1, 'Fahad','Male',10000),
    (2,'Saad','Male',20000),
    (3,'Asif','Male',30000)

SELECT * FROM [User]
UNPIVOT ([Val] FOR Cols IN (name,gender,sal)) Unp
PIVOT   (MAX([Val]) FOR Id IN ([1],[2],[3])) Piv


Cols    1      2      3
------  ------ ------ -------
Gender  Male   Male   Male
Name    Fahad  Saad   Asif
sal     10000  20000  30000