CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

和前几天的题目类似,请各位老师替我看一下好吗,10点前在线等,谢谢!

楼主qqmylover(学生一个)2004-08-04 19:59:12 在 MS-SQL Server / 应用实例 提问

前几天的问题是: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

相关问题

  • 一道java的题目,应该不难,进来看一下
  • 哪位高手帮我看一下这个JAVA题目
  • 哪位高手帮我看一下这个JAVA题目
  • 几个概念性的题目,帮忙看一下,谢谢
  • 问几个我面试的几道题目,请大家帮忙看一下
  • 这个问题无法在题目里描述,请进来看一下。
  • 陆老师:请您看一下一个初学者的疑问! 谢谢!
  • 大家帮忙看一下,这道题目和最小生成树有什么关系?
  • 高人来看:一道让人想不明白的VC++题目,大家都来看一下。(VC6环境)
  • 请看一下

关键词

  • 字段
  • 检验
  • 内容
  • 查询
  • 项目
  • yq
  • 记录
  • yl
  • wd
  • 类别

得分解答快速导航

  • 帖主:qqmylover
  • Functions
  • hero1981
  • hero1981
  • e_lyf
  • pengda1i
  • CSDMN
  • zjcxc
  • souplight

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo