和前几天的题目类似,请各位老师替我看一下好吗,10点前在线等,谢谢!
前几天的问题是:http://community.csdn.net/Expert/topic/3227/3227902.xml?temp=.0915491
现在的问题是如果记录中有一个标志字段flag,两条记录在同一个表中,两条记录的项目编号相同,如果有一条记录的flag值是"N",另一条和它项目编号相同的另一条记录的flag值是"Y",并且第二条记录的部分字段也有值,现在我想取第二条所有有内容的字段和第一条记录中的所有和第二条记录有内容的字段不同的那些字段,然后将这两条记录字段组成一条记录,这条语句怎样写?听起来有点绕口,我举个例子说明一下你们就明白了
create table 表(类别 varchar(3),no varchar(3),yl1 decimal(3),yl2 decimal(3),wd1 decimal(3),wd2 decimal(3),yq1 decimal(3),yq2 decimal(3),flag char(1))
insert 表 select 'A','1',198,199,300,300,400,400,'N'
union all select 'A','2',0,0,888,999,0,0,'Y'
union all select 'B','3',200,200,300,300,500,500 ,'N'
union all select 'B','4',0,0,0,0,222,333,'Y'
union all select 'C','5',201,202,403,404,505,506,'Y'
应该的结果是:
类别 no yl1 yl2 wd1 wd2 yq1 yq2 flag
------------------------------------------------------------------
A 1 198 199 888 999 400 400 N
B 3 200 200 222 333 500 500 N
C 5 201 202 403 404 505 506 Y
问题点数:20、回复次数:21Top
1 楼qqmylover(学生一个)回复于 2004-08-04 21:04:03 得分 0
怎么没人回答?难道还要我请邹建老师不成?Top
2 楼qqmylover(学生一个)回复于 2004-08-04 21:59:16 得分 0
等了一晚上也没人回答,只好后天再来了,我希望到时候能看到满意的答案,谢谢!Top
3 楼Functions(方程)回复于 2004-08-04 22:21:56 得分 2
说的不明确,并且结果还有歧义。
不过提醒你一点:有时候你的查询很难实现,考虑一下你的数据库结构设计是否有问题?!不好的数据库设计造成你的查询困难。Top
4 楼qqmylover(学生一个)回复于 2004-08-05 19:53:58 得分 0
我想数据设计问题应该不大,实际问题是这样的,产品检验时如果某项指标不合格则进行重新检验,但是只检验不合格的项目,如果复验该指标合格后,将该项记录和原来检验的合格的记录重新组合成一条新的记录,这条新组合的记录用来开具质量证明书,我不知道你们明白了没有Top
5 楼qqmylover(学生一个)回复于 2004-08-05 20:01:51 得分 0
那你说该怎样设计此数据库结构?Top
6 楼hero1981(英雄)回复于 2004-08-06 10:15:49 得分 2
可不可以用触发器,当insert一条时,将0都用以前的值添好,避免查询困难。
数据库新手,意见仅供参考Top
7 楼hero1981(英雄)回复于 2004-08-06 10:53:42 得分 2
我又有了一个新的想法,希望对你有用,利用decode函数,具体如下:
select t2.类别,t2.no,decode(t2.yl1,0,t1.yl1,t2.yl1),
decode(t2.yl2,0,t1.tl2,t2.yl2),
decode(t2.wd1,0,t1.wd1,t2.wd1),
decode(t2.wd2,0,t1.wd2,t2.wd2),
decode(t2.yq1,0,t1.yq1,t2.yq1),
decode(t2.yq2,0,t1.yq2,t2.yq2)
from table t1,table t2 where t1.类别=t2.类别 and t1.flag='N' and t2.flag='Y'
不过抱歉,我没有测试过,你就自己试一下吧。Top
8 楼e_lyf()回复于 2004-08-06 14:10:24 得分 3
create table #TB(类别 varchar(3),no varchar(3),yl1 decimal(3),yl2 decimal(3),wd1 decimal(3),wd2 decimal(3),yq1 decimal(3),yq2 decimal(3),flag char(1))
insert #TB select 'A','1',198,199,300,300,400,400,'N'
union all select 'A','2',0,0,888,999,0,0,'Y'
union all select 'B','3',200,200,300,300,500,500 ,'N'
union all select 'B','4',0,0,0,0,222,333,'Y'
union all select 'C','5',201,202,403,404,505,506,'Y'
select * from #TB where flag='N'
union all
select a.* from #TB a
left outer join #TB b on b.flag='N' and a.[类别]=b.[类别]
where a.flag='Y' and b.flag is null
drop table #TBTop
9 楼qqmylover(学生一个)回复于 2004-08-06 17:44:46 得分 0
我先测试一下Top
10 楼qqmylover(学生一个)回复于 2004-08-06 17:47:29 得分 0
结果不对啊,谢谢,请各位再继续指点!Top
11 楼pengda1i(冒牌大力 V0.4)回复于 2004-08-06 18:42:52 得分 0
说说你取值的规则
Top
12 楼pengda1i(冒牌大力 V0.4)回复于 2004-08-06 18:50:24 得分 0
好像是
select
isnull(a.类别,b.类别) as 类别,
isnull(a.no,b.no) as no,
isnull(a.yl1,b.yl1) as yl1,
isnull(a.yl2,b.yl2) as yl2,
isnull(b.wd1,a.wd1) as wd1,
isnull(b.wd2,a.wd2) as wd2,
isnull(a.yq1,b.yq1) as yq1,
isnull(a.yq2,b.yq2) as yq2,
isnull(a.flag,b.flag) as flag
from 表 a full join 表 b
on a.flag='N' and b.flag='Y' and a..[类别]=b.[类别]
Top
13 楼pengda1i(冒牌大力 V0.4)回复于 2004-08-06 18:57:06 得分 5
select
isnull(a.类别,b.类别) as 类别,
isnull(a.no,b.no) as no,
isnull(a.yl1,b.yl1) as yl1,
isnull(a.yl2,b.yl2) as yl2,
isnull(b.wd1,a.wd1) as wd1,
isnull(b.wd2,a.wd2) as wd2,
isnull(a.yq1,b.yq1) as yq1,
isnull(a.yq2,b.yq2) as yq2,
isnull(a.flag,b.flag) as flag
from (select * from 表 where flag='N') a full join (select * from 表 where flag='Y') b
on a.[类别]=b.[类别]
Top
14 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-06 19:00:49 得分 2
都不对,问题是你的替换规则没有说明
类别 no yl1 yl2 wd1 wd2 yq1 yq2 flag
------------------------------------------------------------------
A 1 198 199 888 999 400 400 N
^^为什么不是替换yl1 yl2
B 3 200 200 222 333 500 500 N
^^为什么不是替换yq1 yq2
C 5 201 202 403 404 505 506 Y
Top
15 楼qqmylover(学生一个)回复于 2004-08-07 16:36:17 得分 0
因为所有的记录以flag为N的为准,也就是说类别相同的记录以flag为“Y”的为先,这次大家明白了吗?Top
16 楼qqmylover(学生一个)回复于 2004-08-07 16:42:19 得分 0
错了,是以'Y'为准Top
17 楼zjcxc(邹建)回复于 2004-08-07 16:56:02 得分 2
不明,与 CSDMN(冒牌经理 V0.2) 有同样的疑问Top
18 楼souplight(~~~~扬帆起航)回复于 2004-08-07 17:54:18 得分 2
B 3 200 200 222 333 500 500 N
^^为什么不是替换yq1 yq2Top
19 楼qqmylover(学生一个)回复于 2004-08-07 20:57:10 得分 0
实在对不起,我刚才又重新看了一下我的问题,发现我的描述有点问题,项目编号应该改为类别,也就是至多两条记录的类别相同,如果有相同的,肯定是有一条记录的flag值是"N",另一条和它类别相同的记录的flag值是"Y"(这是事先要求的,必须是这样存数的,第二条记录的flag值肯定是"Y"),并且第二条记录的部分字段也有值,现在我想取第二条所有有内容的字段和第一条记录中的所有和第二条记录有内容的字段不同的那些字段,然后将这两条记录字段组成一条记录,换句话说就是如果第二条记录的有内容的字段(可能有多个,也可能个有几个),如果有,那么就取第二条记录中的有内容的字段,而对第一条记录的处理是:过滤掉第二条有内容的字段,取剩余字段内容,然后和第二条记录的有内容的字段合起来组成一条新的完整的记录,不替换yq1,yq2时因为888、999在第二条的字段对应的是wd1、wd2,所以不能替换yq1、yq2,只能替换第一条记录的wd1、wd2,这次大家明白了吗?Top
20 楼qqmylover(学生一个)回复于 2004-08-08 08:59:39 得分 0
我来看看,有没有新答案Top
21 楼qqmylover(学生一个)回复于 2004-08-09 08:16:20 得分 0
我查了一下帮助,自己搞定了,谢谢大家了,散分!Top




