CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请教一个两表关联判断的SQL语句

楼主bluesky1980(sugar)2005-11-16 08:51:11 在 MS-SQL Server / 基础类 提问

两个表  
  table   A   (tel_no,info,num)   ;   table   B   (area,tel_area)  
                A                                               B  
  tel_no         info       num             area       tel_area  
  61234567     wang         1                 西城       6123  
  61235467     yang         2                 西城       61245  
  61245555     li             3                 东城       6789  
  67894321     li             2                 东城       6786  
  67866666     wang         1                
  67895555     li             5              
   
  我想找出每个区的号码个数及NUM总数    
  逻辑:B表中的tel_area与A表中的tel_no前四(五)位关联,即:通过比较  
  A表中的tel_no前四(五)位与B表中的tel_area字段来决定A表中该号码属于哪个区  
  注:若B表中的tel_area出现五位,则该五位的前四位就不会出现在B表中,如:存在   “西城       61245”这条记录,就不会有“西城       6124”这条记录.  
   
  由上述测试数据想得到如下结果:  
  area   count     total_num  
  西城       3               6(1+2+3得出的)  
  东城       3               8(2+1+5得出的) 问题点数:50、回复次数:11Top

1 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-11-16 09:07:14 得分 20

select    
        area=B.area,  
        count=count(*),  
        total_num=sum(num)  
  from   表A   A   inner   join   表B   B  
  on   substring(A.tel_no,1,4)=substring(B.tel_area,1,4)  
  group   by   B.area  
  order   by   area   desc  
  Top

2 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-11-16 09:08:00 得分 0

--测试环境  
  declare   @A   table(tel_no   varchar(20),info   varchar(10),num   int)  
  insert   into   @A   select   '61234567','wang',1  
  union   all   select   '61235467','yang',2  
  union   all   select   '61245555','li',3  
  union   all   select   '67894321','li',2  
  union   all   select   '67866666','wang',1  
  union   all   select   '67895555','li',5  
   
  declare   @B   table(area   varchar(10),tel_area   varchar(10))  
  insert   into   @B   select   '西城','6123'  
  union   all   select   '西城','61245'  
  union   all   select   '东城','6789'  
  union   all   select   '东城','6786'  
   
  --查询语句  
  select    
        area=B.area,  
        count=count(*),  
        total_num=sum(num)  
  from   @A   A   inner   join   @B   B  
  on   substring(A.tel_no,1,4)=substring(B.tel_area,1,4)  
  group   by   B.area  
  order   by   area   desc  
  --结果  
  area               count               total_num        
  ----------   -----------   -----------    
  西城                   3                       6  
  东城                   3                       8  
   
  Top

3 楼wangdehao(找找找(现在很幸福))回复于 2005-11-16 09:14:27 得分 20

select   area,count(*)   as   [count],sum(tel_area)   as     total_num   from(select   B.area,B.tel_area  
    from   B   inner   join   A    
  on   left(A.tel_no,len(B.tel_area))=B.tel_area)t   group   by   areaTop

4 楼wangdehao(找找找(现在很幸福))回复于 2005-11-16 09:18:57 得分 0

select   area,count(*)   as   [count],sum(   num   )   as     total_num   from  
  (select   B.area   ,B.tel_area,A.num  
    from   @B   B   inner   join   @A   A  
  on   left(A.tel_no,len(B.tel_area))=B.tel_area)t    
  group   by   area  
  Top

5 楼wangdehao(找找找(现在很幸福))回复于 2005-11-16 09:26:50 得分 0

1楼的有点问题的:  
  --当数据为:  
  declare   @A   table(tel_no   varchar(20),info   varchar(10),num   int)  
  insert   into   @A   select   '61234567','wang',1  
  union   all   select   '61235467','yang',2  
  union   all   select   '61245555','li',3   -----它  
  union   all   select   '67894321','li',2  
  union   all   select   '67866666','wang',1  
  union   all   select   '67895555','li',5  
  union   all   select   '61246555','li',5     -------它  
   
  declare   @B   table(area   varchar(10),tel_area   varchar(10))  
  insert   into   @B   select   '西城','6123'  
  union   all   select   '西城','61245'   ---它  
  union   all   select   '东城','6789'  
  union   all   select   '东城','6786'  
  union   all   select   '西城','61246'     ----它  
   
  --时,结果是不正确的Top

6 楼spsaint(圣人)回复于 2005-11-16 10:06:31 得分 3

SELECT   B.tel_area,COUNT(A.tel_no),SUM(A.NUM)  
  FROM   A  
  INNER   JOIN   B   ON   SUBSTRING(tel_no   ,1,4)=SUBSTRING(   tel_area,1,4)    
  GROUP   BY   tel_areaTop

7 楼kubou(牧逸)回复于 2005-11-16 11:25:29 得分 3

select    
        area=B.area,  
        count=count(*),  
        total_num=sum(num)  
  from   表A   A   inner   join   表B   B  
  on   substring(A.tel_no,1,4)=substring(B.tel_area,1,4)  
  group   by   B.area  
  order   by   area   descTop

8 楼funsuzhou(☆【处变不惊】☆)回复于 2005-11-16 11:48:08 得分 4

declare   @a   table   (tel_no   int,info   varchar(16),num   int)  
  insert   into   @a  
  select   61234567,     'wang',         1   union   all  
  select   61235467,     'yang',         2   union   all  
  select   61245555,     'li',             3   union   all  
  select   67894321,     'li',             2   union   all  
  select   67866666,     'wang',         1   union   all  
  select   67895555,     'li',             5  
   
   
  declare   @b   table   (area   varchar(16),tel_area   int)  
  insert   into   @b  
  select   '西城',       6123     union   all  
  select   '西城',       61245   union   all  
  select   '东城',       6789     union   all  
  select   '东城',       6786  
   
   
  select   t.area,count(t.num)as   [count],sum(t.num)   as   total_num   from   (  
  select   b.area,a.num   from   @a   a,@b   b   where   charindex(cast(b.tel_area   as   varchar),cast(a.tel_no   as   char(8)))>0  
  )t   group   by   t.area  
   
   
  /*  
  area                           count               total_num        
  ----------------   -----------   -----------    
  东城                               3                       8  
  西城                               3                       6  
   
  (所影响的行数为   2   行)  
  */Top

9 楼funsuzhou(☆【处变不惊】☆)回复于 2005-11-16 12:23:28 得分 0

好象有问题,前面贴的不算  
  Top

10 楼funsuzhou(☆【处变不惊】☆)回复于 2005-11-16 12:38:32 得分 0

--乱了测试数据的顺序,并加了一些测试数据,以下是修改后的代码:  
   
  declare   @a   table   (tel_no   int,info   varchar(16),num   int)  
  insert   into   @a  
  select   61234567,     'wang',         1   union   all  
  select   61245555,     'li',             3   union   all  
  select   67894321,     'li',             2   union   all  
  select   67866666,     'wang',         1   union   all  
  select   61235467,     'yang',         2   union   all  
  select   67895555,     'li',             5   union   all  
  select   61245999,     'zhang',       6   union   all  
  select   61238888,     'zhang',       7  
   
   
  declare   @b   table   (area   varchar(16),tel_area   int)  
  insert   into   @b  
  select   '西城',       6123     union   all  
  select   '西城',       61245   union   all  
  select   '东城',       6789     union   all  
  select   '东城',       6786  
   
   
  select   t.area,count(num)as   [count],sum(num)as   total_num   from   (  
  select   b.area,a.num,sumflag=case   when   charindex(cast(b.tel_area   as   varchar),cast(a.tel_no   as   char(8)))>0   then   1   else   0   end     from   @b   b,@a   a  
  )t  
  where   t.sumflag=1  
  group   by   t.area  
   
   
  /*  
  area                           count               total_num        
  ----------------   -----------   -----------    
  东城                               3                       8  
  西城                               5                       19  
   
  (所影响的行数为   2   行)  
  */Top

11 楼wangdehao(找找找(现在很幸福))回复于 2005-11-16 12:53:26 得分 0

--这样也可以:  
  select   area,count(*)   as   [count],sum(   num   )   as     total_num   from  
  (select   B.area   ,B.tel_area,A.num  
    from   @B   B   inner   join   @A   A  
  on   charindex(B.tel_area,left(A.tel_no,5))>0)t    
  group   by   area  
  Top

相关问题

  • 请教一个两表关联判断的SQL语句
  • SOS,求这句SQL语句,急用!如何判断2个表有关联?
  • 日期判断sql语句
  • 求一关联sql语句
  • 判断执行sql语句的数量
  • sql语句加判断行吗?
  • 请问在SQL语句中如何加上判断语句?
  • 如何用if 判断语句来打开不同的 sql语句??
  • 表关联的sql语句(急!)
  • 表关联sql语句问题,谢谢

关键词

  • tel
  • 西城
  • area
  • 表中
  • 东城
  • wang
  • num
  • li
  • 前四
  • count

得分解答快速导航

  • 帖主:bluesky1980
  • zlp321002
  • wangdehao
  • spsaint
  • kubou
  • funsuzhou

相关链接

  • SQL Server类图书

广告也精彩

反馈

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