将列名称移动到行

问题描述 投票:2回答:4

我有一个日期为列名为enter image description here的表

但我希望将这些日期放在一行中的多列中,如下所示:

Date       Index
20170806   9206
20170813   8041
20170820   8861
20170827   8356

我怎么能在SQL Server中执行此操作

sql sql-server
4个回答
1
投票

如果您想要更加动态的解决方案而不是硬编码所有列,下面的脚本应该工作:

IF OBJECT_ID('TestTable') IS NOT NULL 
DROP TABLE TestTable;

CREATE TABLE TestTable
(
    [20170806] INT NOT NULL,
    [20170813] INT NOT NULL,
    [20170820] INT NOT NULL,
    [20170827] INT NOT NULL
)

INSERT INTO TestTable VALUES (9206, 8041, 8861, 8356)


DECLARE @cols NVARCHAR(MAX),
        @sql  NVARCHAR(MAX)

SELECT  @cols = COALESCE(@cols + ',', '') + QUOTENAME(c.COLUMN_NAME)
FROM   INFORMATION_SCHEMA.[COLUMNS] AS c
WHERE  c.TABLE_NAME = 'TestTable'

SET @sql = '
SELECT [Date],
       [Index]
FROM   TestTable 
       UNPIVOT([Index] FOR [Date] IN ('+ @cols +')) AS up'

exec sp_executesql @sql;

1
投票

你可以使用UNPIVOT

SELECT * FROM MyTable 
UNPIVOT([Date] For [Index] IN( [20170806], [20170813], [20170820], [20170827])) UNPVT

此外,如果要动态创建它,也可以使用此查询。

DECLARE @ColNames NVARCHAR(MAX) 
    = STUFF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        (SELECT T.* FROM (VALUES(1)) AS DUMY(ID) LEFT JOIN MyTable T ON 1=2 FOR XML AUTO, ELEMENTS XSINIL )
        ,'<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">','')
        ,'</T>','')
        ,'_x0032_','2')
        ,' xsi:nil="true"/>','] ')
        ,'<',',[') ,1,1,'')


DECLARE @SqlQ NVARCHAR(MAX) 
    = 'SELECT * FROM MyTable UNPIVOT([Date] For [Index] IN( ' + @ColNames  + ')) UNPVT'

EXEC sp_executesql @SqlQ

0
投票

你可以使用如下的枢轴:

但是,我不知道你确切的表名

select field_names
from table_name
pivot
( index
for index in ( Date, Index)
) pivot

但是有用的文章是

“Qazxswpoi”


0
投票

设计表(可变)结构如下。希望它符合您的表结构。

https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

你可以使用DECLARE @data TABLE ( [20170806] INT, [20170813] INT, [20170820] INT, [20170827] INT ) INSERT INTO @data VALUES (9206, 8041, 8861, 8356) SELECT * FROM @data 语句。 UNPIVOT

If you have dynamic columns, check this

而输出是

SELECT [Date],[Index] FROM @data UNPIVOT ( [Index] FOR [Date] IN ([20170806], [20170813], [20170820], [20170827]) ) AS unpivotTable;

© www.soinside.com 2019 - 2024. All rights reserved.