2016-09-29 42 views
-1

我试图找出一种方法来将[列1],[列2],[列3],[列4],[列5] 转换为单列[类型]。我也希望它有行号。因此,我希望它看起来像一个例子。此外,如果我只想要输入数据列,该怎么办?像Column1和Column2都有值,但是列3,4和5没有。在这种情况下,我只想让1和2显示在我的结果集上。如何使用行号将多列转换为单行?

现在:

[ID1]-[Column1],[Column2],[Column3],[Column4],[Column5] 

[ID2]-[Column1],[Column2],[Column3],[Column4],[Column5] 

愿望:

[ID1]-[Column1],[Row1] 

[ID1]-[Column2],[Row2] 

[ID1]-[Column3],[Row3] 

[ID1]-[Column4],[Row4] 

[ID1]-[Column5],[Row5] 

[ID2]-[Column1],[Row1] 

[ID2]-[Column2],[Row2] 

Etc...... 

谢谢!

+2

使用UNPIVOT声明 –

+0

的可能的复制[如何插入行通过选择列的表名称和值从SQL Server中的另一个表](http://stackoverflow.com/questions/39763621/how-to-insert-row-into-a-table-by-select-column-name-and-value-from -otherother-tabl) –

+0

不理解RowNumber?只是为了表明列号? –

回答

0

尝试一些像这样的事情,但是这可能是不可靠的解决方案,但完成工作,以逆透视表第一

SELECT Col,Row_NUMBER() OVER(ORDER BY [ID]) RowNo 
FROM (

     SELECT [ID],CAST([ID] AS VARCHAR(30))+'-'+[COLUMN1] as Col 
     FROM TableName 
     UNION ALL 
     SELECT [ID],CAST([ID] AS VARCHAR(30))+'-'+[COLUMN2] as Col 
     FROM TableName 
     UNION ALL 
     SELECT [ID],CAST([ID] AS VARCHAR(30))+'-'+[COLUMN3] as Col 
     FROM TableName 
     ...Like wise for other columns 

)M 
ORDER BY [ID] 
+0

你能否提供一些解释为什么你的答案能够回答这个问题?只有代码的答案对于提问者来说并不像解释良好的答案那样有用。 – Zack

0

一个方法是使用十字/外部应用和Table Value Constructors

--sample data 
WITH cte AS (
    SELECT * 
    FROM (VALUES (1, 'col1', 'col2', 'col3', 'col4', 'col5'), 
        (2, 'col1', 'col2', 'col3', 'col4', 'col5')) 
    t(id, column1,column2,column3,column4,column5) 
) 
--query 
SELECT cte.id, 
     t.* 
FROM cte 
OUTER APPLY (VALUES(column1, 1),(column2, 2),(column3, 3),(column4, 4),(column5, 5)) t([type],[rownum]) 
0

您可以使用UNPIVOT扭转列行:

;WITH YourTable AS (
SELECT * 
FROM (VALUES 
('ID1','Column11','Column12','Column13','Column14','Column15'), 
('ID2','Column21','Column22','Column23','Column24','Column25') 
) as t([ID],[Column1],[Column2],[Column3],[Column4],[Column5]) 
) 

SELECT * 
FROM (
    SELECT [Column1] as [Row1], 
      [Column2] as [Row2], 
      [Column3] as [Row3], 
      [Column4] as [Row4], 
      [Column5] as [Row5], 
      [ID] 
    FROM YourTable 
) t 
UNPIVOT (
    [Type] FOR [Column] IN ([Row1],[Row2],[Row3],[Row4],[Row5]) 
) as unp 

输出:

ID Type  Column 
ID1 Column11 Row1 
ID1 Column12 Row2 
ID1 Column13 Row3 
ID1 Column14 Row4 
ID1 Column15 Row5 
ID2 Column21 Row1 
ID2 Column22 Row2 
ID2 Column23 Row3 
ID2 Column24 Row4 
ID2 Column25 Row5 
+0

如果我只是想要输出数据的列,该怎么办?像Column11和Column12都有值,但是第13,14和15列没有。在这种情况下,我只想让11和12显示在我的结果集上。 – EkansDasnakE

+0

您可以尝试设置NULL而不是此值并尝试运行我的脚本,AFAIK unpivot将摆脱此行。 – gofr1

+0

将删除空值,在这里测试https://data.stackexchange.com/stackoverflow/query/edit/546616 – gofr1