有人可以帮帮我吗。 我环顾四周,找不到类似于我需要做的事情。基本上,
我有一个需要旋转的表,它来自一个平面文件,它将所有列加载为一个逗号分隔列。在枢轴之前我需要将列分成各自的顺序,并且我已经完成了这样做的程序。但是,这个表的关键是我需要在继续之前编辑标题。
我需要帮助来转移第一列中的信息并将其放入另一个我创建的表中。因此,我需要这个
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
答案 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
以上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) = ','