有下面两张表:Tab_Main字段1      字段2
A001         aaa
B002         bbb
Tab_Sub
字段1(与Tab_Main相连)     字段2         字段3
A001                      1类型          100
A001                      3类型          100
A001                      6类型          100
A002                      2类型          200
A002                      4类型          200
我要的结果字段1                     字段2         字段3     字段4
A001                      3类型         300         aaa
A002                      4类型         400         bbb解释一下,字段3就是同一个编码的汇总,字段2比较复杂,它的优先顺序是
5类型>4类型>3类型>2类型>1类型>6类型,这些类型的值的第一个字符都是1到6的数字,他们字段的长度不一样,比如: 1键盘,2显示器,3网卡 等。只能根据前面的数字判断该取哪一个。

解决方案 »

  1.   

    if object_id('pubs..Tab_Main') is not null
       drop table Tab_Main
    go
    create table Tab_Main(字段1 varchar(10),字段2 varchar(10))
    insert into Tab_Main(字段1,字段2) values('A001',         'aaa')
    insert into Tab_Main(字段1,字段2) values('A002',         'bbb')
    goif object_id('pubs..Tab_Sub') is not null
       drop table Tab_Sub
    gocreate table Tab_Sub(字段1 varchar(10),字段2 varchar(10),字段3 int)
    insert into Tab_Sub(字段1,字段2,字段3) values('A001',                      '1类型',          100)
    insert into Tab_Sub(字段1,字段2,字段3) values('A001',                      '3类型',          100)
    insert into Tab_Sub(字段1,字段2,字段3) values('A001',                      '6类型',          100)
    insert into Tab_Sub(字段1,字段2,字段3) values('A002',                      '2类型',          200)
    insert into Tab_Sub(字段1,字段2,字段3) values('A002',                      '4类型',          200)
    goselect 字段1 , replace(字段2 , '0' , '6') 字段2 , 字段3 , 字段4 from
    (
    select m.* , n.字段2 as 字段4 from
    (
      select 字段1 , max(字段2) 字段2 , sum(字段3) 字段3 from
      (
        select 字段1 , replace(字段2 , '6' , '0') 字段2 , 字段3 from Tab_Sub
      ) t
      group by 字段1
    ) m,Tab_Main n
    where m.字段1 = n.字段1
    ) ttdrop table Tab_Main,Tab_Sub/*
    字段1      字段2   字段3       字段4        
    ---------- ----- ----------- ---------- 
    A001       3类型   300         aaa
    A002       4类型   400         bbb(所影响的行数为 2 行)
    */
      

  2.   

    这么复杂啊。我想能不能通过Tab_Sub 得出下面的结果(做成试图)
    字段1(与Tab_Main相连) 字段2 字段3
    A001                  3类型 100
    A001                  3类型 100
    A001                  3类型 100
    A002                  4类型 200
    A002                  4类型 200
      

  3.   

    5类型>4类型>3类型>2类型>1类型>6类型谁叫你有这么个规则?
      

  4.   

    create table Tab_Main(name1 varchar(250),
                          name2 varchar(250)   
    )
    insert into Tab_Main(name1,name2)
    select 'A001','aaa'
    union all
    select 'A002','bbb'create table Tab_Sub
    (
    name1 varchar(250),
    type varchar(250),
    name3 float(8))
    insert into Tab_Sub (name1,type,name3)
    select 'A001','1类型',100
    union all
    select 'A001','3类型',100
    union all
    select 'A001','6类型',100
    union all
    select 'A002','2类型',200
    union all
    select 'A002','4类型',200select c.name1,c.name2,c.type,sum(c.name3)
    from
    (
    select 
    a.name1,
    a.name2,
    case  when (select max(left(type,1))-6 from Tab_Sub where Tab_Sub.name1=a.name1) <0
          then (select max(type) from Tab_Sub where Tab_Sub.name1=a.name1)
          else  (select max(type) from Tab_Sub where Tab_Sub.name1=a.name1 
                 and left(type,1)<>6
                )
    end as type,
    b.name3
    from Tab_Main a join Tab_Sub b  on a.name1=b.name1
    )c
    group by c.name1,c.name2,c.type
      

  5.   

    先把6类型update成0类型,就好办了嘛
      

  6.   

    不需要Update,当然也不允许。可以%第一个数字可以得到5,4,3,2,1,0 的结果
    后面怎么做,我正在产生中
      

  7.   

    OK,使用Tab_Sub.字段2 % 6作排序,然后使用子查询做视图,得到
    字段1(与Tab_Main相连) 字段2 字段3
    A001 3类型 100
    A001 3类型 100
    A001 3类型 100
    A002 4类型 200
    A002 4类型 200
      

  8.   

    create table Tab_Main(name1 varchar(250),
                          name2 varchar(250)   
    )
    insert into Tab_Main(name1,name2)
    select 'A001','aaa'
    union all
    select 'A002','bbb'create table Tab_Sub
    (
    name1 varchar(250),
    type varchar(250),
    name3 float(8))
    insert into Tab_Sub (name1,type,name3)
    select 'A001','1类型',100
    union all
    select 'A001','3类型',100
    union all
    select 'A001','6类型',100
    union all
    select 'A002','2类型',200
    union all
    select 'A002','4类型',200select name1, convert(varchar,(case  
    when max(convert(tinyint ,substring(type,1,1)) %6)= 0 then 6
    else
    max(convert(tinyint ,substring(type,1,1)) %6)
    end ) )+'类型' type 
    , sum(name3)as num  into #tb  from Tab_Sub  group by name1select #tb.*,Tab_main.name2 from #tb join Tab_main on #tb.name1=Tab_main.name1
    drop table #tb
    drop table Tab_main
    drop table Tab_sub
      

  9.   

    create table Tab_Main(name1 varchar(250),
                          name2 varchar(250)   
    )
    insert into Tab_Main(name1,name2)
    select 'A001','aaa'
    union all
    select 'A002','bbb'create table Tab_Sub
    (
    name1 varchar(250),
    type varchar(250),
    name3 float(8))
    insert into Tab_Sub (name1,type,name3)
    select 'A001','1类型',100
    union all
    select 'A001','3类型',100
    union all
    select 'A001','6类型',100
    union all
    select 'A002','2类型',200
    union all
    select 'A002','4类型',200
    create Function orderBY(@name1 varchar(10))
    returns varchar(10)
    as
    begin
       declare @type varchar(10)
       select top 1 @type=type from Tab_Sub where name1=@name1
                                            order by case when type='5类型' then 0
                                                       when type='4类型' then 1
                                                       when type='3类型' then 2
                                                       when type='2类型' then 3
                                                       when type='1类型' then 4
                                                       when type='6类型' then 5 end 
       return @type
    end
    -----------------
    select T.name1,dbo.orderBY(T.name1),T.name3,M.name2
    from 
        (
           select name1,sum(name3) as name3
            from Tab_Sub
            group by name1
         ) T,
         Tab_Main M
    where T.name1=M.name1