如何水平显示表格数据?
这是我的表定义
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 |
+========+=======+======+======+
答案 0 :(得分:4)
也许是UNPIVOT
和PIVOT
的组合?
(虽然您的列必须属于同一类型才能实现,但我在表格中进行了更改,或者您只能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_transfer
和UNPIVOT
进行组合。
请尝试以下操作,它可能会为您提供您所期望的确切结果。请先改变你的设计
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