但我希望将这些日期放在一行中的多列中,如下所示:
Date Index
20170806 9206
20170813 8041
20170820 8861
20170827 8356
我怎么能在SQL Server中执行此操作
如果您想要更加动态的解决方案而不是硬编码所有列,下面的脚本应该工作:
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;
你可以使用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
你可以使用如下的枢轴:
但是,我不知道你确切的表名
select field_names
from table_name
pivot
( index
for index in ( Date, Index)
) pivot
但是有用的文章是
“Qazxswpoi”
设计表(可变)结构如下。希望它符合您的表结构。
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;