2017-10-12 39 views
2

我有約會這樣的表作爲列名enter image description here運動列名行

,但我想有一列,這些日期在多行是這樣的:

Date  Index 
20170806 9206 
20170813 8041 
20170820 8861 
20170827 8356 

我怎樣才能做到這一點在SQL Server

+0

看支點 - https://technet.microsoft.com /en-us/library/ms177410(v=sql.105).aspx。但是,在結構中有數據似乎會導致你很多悲傷。 – Leonidas199x

回答

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; 
0

設計的表(可變)結構如下。 希望它匹配你的表格結構。

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; 

和輸出

enter image description here

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

會更有用,如果你讓它動態。 –