当前位置: 代码迷 >> Sql Server >> 怎么在SQL 2000中 把一个字段的内容拆成N行N列
  详细解决方案

怎么在SQL 2000中 把一个字段的内容拆成N行N列

热度:111   发布时间:2016-04-24 18:44:05.0
如何在SQL 2000中 把一个字段的内容拆成N行N列

如何把TAB1表:
A710         A711
张三     扣1;缺勤;11天;扣2;旷工;2天;扣3;考核不合格;
张五     扣1;旷工;2天;扣2;事假;3天;


变成TAB2表:
A710     类别        天数
张三     缺勤        11天
张三     旷工         2天
张三     考核不合格
张五     旷工         2天
张五     事假         3天

数据库是SQL 2000的
------解决方案--------------------
本帖最后由 TravyLee 于 2014-02-13 11:33:58 编辑
引用:
Quote: 引用:


----------------------------------------------------------------
-- Author  :TravyLee(走自己的路,让狗去叫吧!)
-- Date    :2014-02-13 10:54:10
-- Version:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
-- Jul  9 2008 14:43:34 
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:#TAB1
if object_id('tempdb.dbo.#TAB1') is not null drop table #TAB1
go 
create table #TAB1([A710] varchar(4),[A711] varchar(42))
insert #TAB1
select '张三','扣1;缺勤;11天;扣2;旷工;2天;扣3;考核不合格;' union all
select '张五','扣1;旷工;2天;扣2;事假;3天;'
go

select top 8000 id = identity(int, 1, 1) into #tb from syscolumns a, syscolumns b 

select A.A710, substring(A.A711, B.id, charindex(';', A.A711 + ';', B.id) - B.id) as [A711]
from #TAB1 A, #tb B 
where substring(';' + A.A711, B.id, 1) = ';' 

 /*
 A710 A711
 -----------------------
张三 扣1
张三 缺勤
张三 11天
张三 扣2
张三 旷工
张三 2天
张三 扣3
张三 考核不合格
张三
张五 扣1
张五 旷工
张五 2天
张五 扣2
张五 事假
张五 3天
张五
 */
drop table #tb,#TAB1

不是这个效果啊  
需要这样
A710     类别        天数
张三     缺勤        11天
张三     旷工         2天
张三     考核不合格
张五     旷工         2天
张五     事假         3天



----------------------------------------------------------------
-- Author  :TravyLee(走自己的路,让狗去叫吧!)
-- Date    :2014-02-13 10:54:10
-- Version:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
-- Jul  9 2008 14:43:34 
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:#TAB1
if object_id('tempdb.dbo.#TAB1') is not null drop table #TAB1
go 
create table #TAB1([A710] varchar(4),[A711] varchar(42))
insert #TAB1
select '张三','扣1;缺勤;11天;扣2;旷工;2天;扣3;考核不合格;' union all
select '张五','扣1;旷工;2天;扣2;事假;3天;'
go
select A.A710,substring(A.A711, B.number, charindex(',', A.A711 + ',', B.number) - B.number) as [A711] into #tb
from (select [A710],REPLACE([A711],'天;',',') as [A711] from #TAB1) A, 
master..spt_values B 
where substring(',' + A.A711, B.number, 1) = ',' 
and type='p' and number >=1


select
A710,LEFT(A711,CHARINDEX(';',A711)-1) as 类别,
ltrim(case when RIGHT(A711,LEN(A711)-CHARINDEX(';',A711))<>'' 
then RIGHT(A711,LEN(A711)-CHARINDEX(';',A711))+'天' 
else '' end) as 天数 from(
select
A710,right(A711,LEN(A711)-CHARINDEX(';',A711)) as A711
from #tb where A711<>''
)t

/*
A710 类别 天数
-----------------------------
张三 缺勤 11天
张三 旷工 2天
张三 考核不合格
张五 旷工 2天
张五 事假 3天
*/

------解决方案--------------------
引用:
Quote: 引用:

从根本上解决问题还是
更改表设计吧


没法子 这些数据都是客户填写的并且格式也是客户给的