首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [向pengdali提问]SQL表的查询与更新,麻烦大侠救命 [已结帖,结帖人:neal_wang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • neal_wang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-04-13 11:51:27 楼主
    麻烦各位侠客救命,先跪谢了!
    原始表内容:Table1
    ID PR Material Panel     QTY   Serial PanelNo
    S001 P001 M1         H1,H2,H3    3
    S002 P002 M3         AH2,AH5     4
    S003 P001 M6         P01,P03     2
    S004 P002 M5         AH3     1
    S005 P006 M8         PA1,PA2     2

    查询原则:
    1)panel的内容用‘,’分割,如H1,H2,H3,QTY为3,则说明是对的,那么在查询结果中分成3行,
      Serial和PanelNo分别为P001-M1-H1,H1;P001-M1-H2,H2;P001-M1-H3,H3
    2) panel的内容用‘,’分割,如AH2,AH5,QTY为4,则说明是错的,结果是Serial和PanelNo没有内容
    3)Serial 为PR + Material + PanelNo

    希望出现的结果:
    ID PR Material Panel       QTY Serial       PanelNo
    S001 P001 M1         H1,H2,H3 1 P001-M1-H1 H1
    S001 P001 M1         H1,H2,H3 1 P001-M1-H2 H2
    S001 P001 M1         H1,H2,H3 1 P001-M1-H3 H3
    S002 P002 M3         AH2,AH5         4
    S003 P001 M6         P01,P03         1 P001-M6-P01 P01
    S003 P001 M6         P01,P03         1 P001-M6-P03 P03
    S004 P002 M5         AH3         1 P002-M5-AH3 AH3
    S005 P006 M8         PA1,PA2         1 P006-M8-PA1 PA1
    S005 P006 M8         PA1,PA2         1 P006-M8-PA2 PA2
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • neal_wang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-13 11:55:041楼 得分:0
    麻烦各位侠客救命,先跪谢了!
    原始表内容:Table1
    ID    PR    Material    Panel      QTY    Serial  PanelNo
    S001  P001    M1        H1,H2,H3    3
    S002  P002    M3        AH2,AH5      4
    S003  P001    M6        P01,P03      2
    S004  P002    M5        AH3          1
    S005  P006    M8        PA1,PA2      2

    查询原则:
    1)panel的内容用‘,’分割,如H1,H2,H3,QTY为3,则说明是对的,那么在查询结果中分成3行,
      Serial和PanelNo分别为P001-M1-H1,H1;P001-M1-H2,H2;P001-M1-H3,H3
    2) panel的内容用‘,’分割,如AH2,AH5,QTY为4,则说明是错的,结果是Serial和PanelNo没有内容
    3)Serial 为PR + Material + PanelNo

    希望出现的结果:
    ID    PR    Material    Panel        QTY    Serial      PanelNo
    S001  P001    M1        H1,H2,H3      1      P001-M1-H1    H1
    S001  P001    M1        H1,H2,H3      1      P001-M1-H2    H2
    S001  P001    M1        H1,H2,H3      1      P001-M1-H3    H3
    S002  P002    M3        AH2,AH5        4
    S003  P001    M6        P01,P03        1      P001-M6-P01    P01
    S003  P001    M6        P01,P03        1      P001-M6-P03    P03
    S004  P002    M5        AH3            1      P002-M5-AH3    AH3
    S005  P006    M8        PA1,PA2        1      P006-M8-PA1    PA1
    S005  P006    M8        PA1,PA2        1      P006-M8-PA2    PA2
    不好意思,刚才对的不齐
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pt1314917
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-13 11:58:452楼 得分:0
    到底要更新原来的表。还是只是查询?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pt1314917
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-13 12:07:083楼 得分:20
    SQL code
    CREATE TABLE A(ID nvarchar(10),PR nvarchar(10),Material nvarchar(10),Panel nvarchar(20), QTY int, SerialID nvarchar(10),Serial varchar(50),PanelNo varchar(20)) INSERT INTO A(ID,PR,Material,Panel,QTY) VALUES('S001', 'P001','M1','H1,H2,H3',3) INSERT INTO A(ID,PR,Material,Panel,QTY) VALUES('S002', 'P002','M3','AH2,AH5',4) INSERT INTO A(ID,PR,Material,Panel,QTY) VALUES('S003', 'P001','M6','P01,P03',2) INSERT INTO A(ID,PR,Material,Panel,QTY) VALUES('S004', 'P002','M5','AH3',1) INSERT INTO A(ID,PR,Material,Panel,QTY) VALUES('S005', 'P006','M8','PA1,PA2',2) GO --如果只是查询: declare @sql varchar(8000) set @sql='' select @sql=@sql+replace(Panel+',',',','''p,'''+id+'''d union all select ''') from a where QTY<>4 set @sql='select '''+@sql set @sql=left(@sql,len(@sql)-19) exec('select id,pr,Material,Panel,[Qty]=case qty when 4 then 4 else 1 end,pr+''-''+Material+''-''+p[Serial],p[PanelNo] from a left join ('+@sql+')b on id=d')
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-04-13 12:16:494楼 得分:20
    SQL code
    --> 测试数据: #T if object_id('tempdb.dbo.#T') is not null drop table #T create table #T (ID varchar(4),PR varchar(4),Material varchar(2),Panel varchar(10),QTY int,Serial varchar(50),PanelNo varchar(50)) insert into #T select 'S001','P001','M1','H1,H2,H3',3,null,null union all select 'S002','P002','M3','AH2,AH5',4,null,null union all select 'S003','P001','M6','P01,P03',2,null,null union all select 'S004','P002','M5','AH3',1,null,null union all select 'S005','P006','M8','PA1,PA2',2,null,null ; with T (ID,P1,P2) as ( select ID,charindex(',',','+Panel),charindex(',',Panel+',')+1 from #T where len(Panel)-len(replace(Panel,',',''))+1=Qty union all select a.ID,b.P2,charindex(',',Panel+',',b.P2)+1 from #T a join T b on a.ID=b.ID where charindex(',',Panel+',',b.P2) > 0 ), P as ( select a.ID,Panel=substring(a.Panel+',',b.P1,b.P2-b.P1-1),Qty=1 from #T a join T b on a.ID=b.ID ) select a.ID, a.PR, a.Material, a.Panel, Qty=isnull(b.QTY,a.Qty), Serial=isnull(a.PR+'-'+a.Material+'-'+b.Panel,''), PanelNo=isnull(b.Panel,'') from #T a left join P b on a.ID=b.ID /* ID PR Material Panel QTY Serial PanelNo S001 P001 M1 H1,H2,H3 1 P001-M1-H1 H1 S001 P001 M1 H1,H2,H3 1 P001-M1-H2 H2 S001 P001 M1 H1,H2,H3 1 P001-M1-H3 H3 S002 P002 M3 AH2,AH5 4 S003 P001 M6 P01,P03 1 P001-M6-P01 P01 S003 P001 M6 P01,P03 1 P001-M6-P03 P03 S004 P002 M5 AH3 1 P002-M5-AH3 AH3 S005 P006 M8 PA1,PA2 1 P006-M8-PA1 PA1 S005 P006 M8 PA1,PA2 1 P006-M8-PA2 PA2 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-04-13 12:26:335楼 得分:0
    SQL code
    --> 测试数据: #T if object_id('tempdb.dbo.#T') is not null drop table #T create table #T (ID varchar(4),PR varchar(4),Material varchar(2),Panel varchar(10),QTY int,Serial varchar(50),PanelNo varchar(50)) insert into #T select 'S001','P001','M1','H1,H2,H3',3,null,null union all select 'S002','P002','M3','AH2,AH5',4,null,null union all select 'S003','P001','M6','P01,P03',2,null,null union all select 'S004','P002','M5','AH3',1,null,null union all select 'S005','P006','M8','PA1,PA2',2,null,null --> 4楼的是2005写法,下面这个适用2000 if object_id('tempdb.dbo.#') is not null drop table # select top 100 ID=identity(int,1,1) into # from syscolumns,sysobjects --> select max(len(Panel)) from #T=11 if object_id('tempdb.dbo.#P') is not null drop table #P select a.ID,Panel=substring(a.Panel+',',b.ID,charindex(',',a.Panel+',',b.ID+1)-b.ID),Qty=1 into #P from #T a inner join # b on substring(','+a.Panel,b.ID,1)=',' where len(a.Panel)-len(replace(a.Panel,',',''))+1=a.Qty select a.ID, a.PR, a.Material, a.Panel, Qty=isnull(b.QTY,a.Qty), Serial=isnull(a.PR+'-'+a.Material+'-'+b.Panel,''), PanelNo=isnull(b.Panel,'') from #T a left join #P b on a.ID=b.ID /* ID PR Material Panel QTY Serial PanelNo S001 P001 M1 H1,H2,H3 1 P001-M1-H1 H1 S001 P001 M1 H1,H2,H3 1 P001-M1-H2 H2 S001 P001 M1 H1,H2,H3 1 P001-M1-H3 H3 S002 P002 M3 AH2,AH5 4 S003 P001 M6 P01,P03 1 P001-M6-P01 P01 S003 P001 M6 P01,P03 1 P001-M6-P03 P03 S004 P002 M5 AH3 1 P002-M5-AH3 AH3 S005 P006 M8 PA1,PA2 1 P006-M8-PA1 PA1 S005 P006 M8 PA1,PA2 1 P006-M8-PA2 PA2 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyflystone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2008-04-13 14:28:376楼 得分:0
    上次好像有一个类同的帖子,


    水一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • neal_wang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-13 21:25:347楼 得分:0
    跟上次的有所区别,是因为我们从SAP导出的数据要经过一系列的处理,然后向网站导出,所以有这么多怪异的问题。由于本人很久没有写这种语句了,所以一时没有找到对应的方法,恳请各位大侠救命啊!多谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

      3

    发表于:2008-04-13 21:28:048楼 得分:0
    貌似很复杂,帮顶.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cch1010
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 08:49:109楼 得分:0
    学习,帮顶!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • utpcb
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 09:24:3110楼 得分:0
    引用 8 楼 dawugui 的回复:
    貌似很复杂,帮顶.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • flairsky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 10:48:0711楼 得分:0
    引用 6 楼 happyflystone 的回复:
    上次好像有一个类同的帖子,


    水一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fcuandy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 09:09:5212楼 得分:0
    不想答
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WANGXUELLD
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 11:04:5513楼 得分:10
    SQL code
    drop table ass CREATE TABLE Ass(ID nvarchar(10),PR nvarchar(10),Material nvarchar(10),Panel nvarchar(20), QTY int, Serial varchar(50),PanelNo varchar(20)) INSERT INTO Ass(ID,PR,Material,Panel,QTY) VALUES('S001', 'P001','M1','H1,H2,H3',3) INSERT INTO Ass(ID,PR,Material,Panel,QTY) VALUES('S002', 'P002','M3','AH2,AH5',4) INSERT INTO Ass(ID,PR,Material,Panel,QTY) VALUES('S003', 'P001','M6','P01,P03',2) INSERT INTO Ass(ID,PR,Material,Panel,QTY) VALUES('S005', 'P006','M8','PA1,PA2',2) INSERT INTO Ass(ID,PR,Material,Panel,QTY) VALUES('S004', 'P002','M5','AH3',1) drop table ass if object_id('xxx') is not null drop proc xxx Create proc xxx as Begin declare @tt table(ID nvarchar(10),PR nvarchar(10),Material nvarchar(10),Panel nvarchar(20), QTY int, Serial varchar(50),PanelNo varchar(20)) declare @ID nvarchar(10) declare @PR nvarchar(10) declare @Material nvarchar(10) declare @Panel nvarchar(20) declare @QTY int declare @t int declare @Panel2 nvarchar(20) declare @Panel3 nvarchar(20) set @t=1 declare cur cursor for select ID, PR,Material,Panel,QTY from ass open cur fetch cur into @ID,@PR,@Material,@Panel,@QTY while @@fetch_status=0 Begin if (charindex(',',@Panel)>0) Begin if (len(@Panel)-len(replace(@Panel,',',''))+1)=@QTY Begin set @Panel2=@Panel while @t<=@QTY Begin --漏洞判断最后一次 if charindex(',',@Panel)>0 set @Panel3=Substring(@Panel,1,Charindex(