现在的位置: 首页 > 综合 > 正文

tsql 行列转换–列转行,根据特定的字符分拆列值

2013年07月24日 ⁄ 综合 ⁄ 共 1647字 ⁄ 字号 评论关闭

(转CSDN) 原文: http://topic.csdn.net/u/20071026/16/59d85356-ff06-44e9-8e01-e6e1869a8a30.html

--形式一:
CREATETABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT1,'中国;日本;韩国'UNIONALL
SELECT2,'美国;意大利;法国'UNIONALL
SELECT3,'德国'
SELECT*FROM A

-- 建立一个辅助的临时表就可以了
SELECTTOP8000 id =identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b  

SELECT
    A.ID,
    COUNTRY
=SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY +';', B.ID) - B.ID)
FROM A, # B
WHERESUBSTRING(';'+ a.COUNTRY, B.id, 1) =';'  
ORDERBY1,2
GO

DROPTABLE A,#
id          country        
----------- ----------------
1           中国;日本;韩国
2           美国;意大利;法国
3           德国

(所影响的行数为 3 行)

ID          COUNTRY 
----------- ---------
1           韩国
1           日本
1           中国
2           法国
2           美国
2           意大利
3           德国

(所影响的行数为 7 行)

表现形式2:
declare@atable(A varchar(20),  B varchar(20),   C varchar(20),    D  varchar(20))
insert@aselect'a1'  ,'b1''c1',   'd1/da'
unionallselect'a2'  ,'b2'  ,'c2'   ,'d22/da/da22'
unionallselect'a3'  ,'b3'  ,'c3'   ,'d3'

declare@ttable( id intidentity(1,1),e int)
insert@tselecttop5001from syscolumns

select a,b,c,substring(d+'/',id,charindex('/',d+'/',id+1)-id)d
from@a a,@t b
wheresubstring('/'+d,id,1)='/'
--result
/*
a                    b                    c                  d                       
-------------------- -------------------- -------------------- ---------------------
a1                   b1                   c1                   d1
a2                   b2                   c2                   d22
a3                   b3                   c3                   d3
a1                   b1                   c1                   da
a2                   b2                   c2                   da
a2                   b2                   c2                   da22

抱歉!评论已关闭.