如何将一行旋转到一列

时间:2014-08-18 13:25:21

标签: sql-server sql-server-2012 unpivot

有人可以帮帮我吗。 我环顾四周,找不到类似于我需要做的事情。基本上,

我有一个需要旋转的表,它来自一个平面文件,它将所有列加载为一个逗号分隔列。在枢轴之前我需要将列分成各自的顺序,并且我已经完成了这样做的程序。但是,这个表的关键是我需要在继续之前编辑标题。

我需要帮助来转移第一列中的信息并将其放入另一个我创建的表中。因此,我需要这个

    ID   Column01

    1    Express,,,Express,,,HyperMakert,,WebStore,Web

要像这样结束......

    New_ID   New_Col

    1        Express
    2        
    3
    4        Express
    5
    6        
    7        HyperMarket
    8
    9        WebStore
    10       Web

请注意,我需要包含原始行中的“黑色列”和。
我看了下面的链接,但是没有用;

SQL Server : Transpose rows to columns Efficiently convert rows to columns in sql server Mysql query to dynamically convert rows to columns

2 个答案:

答案 0 :(得分:0)

在SQL Server中有很多可以在网上找到的字符串拆分方法,有些方法很复杂但有些方法很简单。我喜欢使用动态查询的方式。它简短而简单(不确定性能,但我相信它不会太糟糕):

declare @s varchar(max)
-- save the Column01 string/text into @s variable
select @s = Column01 from test where ID = 1
-- build the query string
set @s = 'select row_number() over (order by current_timestamp) as New_ID, c as New_Col from (values ('''
          + replace(@s, ',', '''),(''') + ''')) v(c)'

insert newTable exec(@s)    
go
select * from newTable

Sqlfiddle Demo

以上values()子句的使用是某种匿名表,这是一个这种用法的简单示例(以便您可以更好地理解它)。以下示例中的匿名表只有1列,表名为v,列名为c。每行只有一个单元格,应该用一对括号()包裹。行以逗号分隔,并在values后跟随。这是代码:

-- note about the outside (...) wrapping values ....
select * from (values ('a'),('b'),('c'), ('d')) v(c)

结果将是:

   c
------
1  a
2  b
3  c
4  d

只需尝试运行该代码,您就会了解它的实用性。

答案 1 :(得分:0)

您可能需要在此处使用计数表。见http://www.sqlservercentral.com/articles/T-SQL/62867/

declare @parameter varchar(4000)

set @parameter = 'Express,,,Express,,,HyperMakert,,WebStore,Web'
set @parameter = ',' + @parameter + ',' -- add commas

with
    e1 as(select 1 as N union all select 1), -- 2 rows
    e2 as(select 1 as N from e1 as a, e1 as b), -- 4 rows
    e3 as(select 1 as N from e2 as a, e2 as b), -- 16 rows
    e4 as(select 1 as N from e3 as a, e3 as b), -- 256 rows
    e5 as(select 1 as N from e4 as a, e4 as b), -- 65536 rows
    tally as (select row_number() over(order by N) as N from e5
)
    select 
        substring(@parameter, N+1, charindex(',', @parameter, N+1) - N-1)
    from tally
    where 
        N < len(@parameter)
        and substring(@parameter, N, 1) = ','