COMPANY_CD     LINE_NO   DC_CODE  其他
000     1 1 其他11
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 5 1 其他51
000 5 0 其他50上面(COMPANY_CD,LINE_NO,DC_CODE)三个是主键,我想通过SQL语句实现城下面这样表示,LINE_NO根据DC_CODE(1,0)成对增加,不存在情况下,设为空。
    COMPANY_CD     LINE_NO   DC_CODE  其他
000     1 1 其他11
000     1 0 NULL
000 2 1 NULL
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 4 0 NULL
000 5 1 其他51
000 5 0 其他50

解决方案 »

  1.   

    create table tb(COMPANY_CD varchar(10),LINE_NO int,DC_CODE int,其他 varchar(10))
    insert into tb values('000', 1 ,1 ,'其他11') 
    insert into tb values('000', 2 ,0 ,'其他20') 
    insert into tb values('000', 3 ,1 ,'其他31')
    insert into tb values('000', 3 ,0 ,'其他30') 
    insert into tb values('000', 4 ,1 ,'其他41') 
    insert into tb values('000', 5 ,1 ,'其他51') 
    insert into tb values('000', 5 ,0 ,'其他50')
    goselect m.* , n.其他 from
    (
    select distinct COMPANY_CD , LINE_NO , 1 DC_CODE from tb
    union all
    select distinct COMPANY_CD , LINE_NO , 0 DC_CODE from tb
    ) m
    left join tb n
    on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
    order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE descdrop table tb/*
    COMPANY_CD LINE_NO     DC_CODE     其他         
    ---------- ----------- ----------- ---------- 
    000        1           1           其他11
    000        1           0           NULL
    000        2           1           NULL
    000        2           0           其他20
    000        3           1           其他31
    000        3           0           其他30
    000        4           1           其他41
    000        4           0           NULL
    000        5           1           其他51
    000        5           0           其他50(所影响的行数为 10 行)*/
      

  2.   

    create table tb(COMPANY_CD varchar(10),LINE_NO int,DC_CODE int,其他 varchar(10))
    insert into tb values('000', 1 ,1 ,'其他11') 
    insert into tb values('000', 2 ,0 ,'其他20') 
    insert into tb values('000', 3 ,1 ,'其他31')
    insert into tb values('000', 3 ,0 ,'其他30') 
    insert into tb values('000', 4 ,1 ,'其他41') 
    insert into tb values('000', 5 ,1 ,'其他51') 
    insert into tb values('000', 5 ,0 ,'其他50')
    go--1
    select m.* , n.其他 from
    (
    select distinct COMPANY_CD , LINE_NO , 1 DC_CODE from tb
    union all
    select distinct COMPANY_CD , LINE_NO , 0 DC_CODE from tb
    ) m
    left join tb n
    on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
    order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE desc--2
    select m.* , n.其他 from
    (
    select t1.* , t2.* from
    (select distinct COMPANY_CD , LINE_NO from tb) t1,
    (select 0 DC_CODE union select 1 DC_CODE ) t2
    ) m
    left join tb n
    on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
    order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE descdrop table tb/*
    COMPANY_CD LINE_NO     DC_CODE     其他         
    ---------- ----------- ----------- ---------- 
    000        1           1           其他11
    000        1           0           NULL
    000        2           1           NULL
    000        2           0           其他20
    000        3           1           其他31
    000        3           0           其他30
    000        4           1           其他41
    000        4           0           NULL
    000        5           1           其他51
    000        5           0           其他50(所影响的行数为 10 行)*/
      

  3.   

    这个可以用两个表的全连接来实现.一个表就是楼主提供的数据表姑且叫TB1
    COMPANY_CD LINE_NO DC_CODE 其他
    000 1 1 其他11 
    000 2 0 其他20 
    000 3 1 其他31 
    000 3 0 其他30 
    000 4 1 其他41 
    000 5 1 其他51 
    000 5 0 其他50
    另一个为辅助表TB2
    DC_CODE 其他B
    1       NULL
    0       NULL
    这样就可以了,语句可以:
    select 
      COMPANY_CD
      ,LINE_NO
      ,DC_CODE
      ,其他
    from
      (
        select A.*, B.* from TB1 A full join TB2 B
      ) T这样就可以了.
      

  4.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-04-26 09:55:14
    -- Verstion:
    --      Microsoft SQL Server 2005 - 9.00.4053.00 (Intel X86) 
    -- May 26 2009 14:24:20 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([COMPANY_CD] varchar(3),[LINE_NO] int,[DC_CODE] int,[其他] varchar(6))
    insert [tb]
    select '000',1,1,'其他11' union all
    select '000',2,0,'其他20' union all
    select '000',3,1,'其他31' union all
    select '000',3,0,'其他30' union all
    select '000',4,1,'其他41' union all
    select '000',5,1,'其他51' union all
    select '000',5,0,'其他50'
    --------------开始查询--------------------------
    select
     a.*,b.其他
    from
    (
    select
     *
    from
    (
    select distinct COMPANY_CD,LINE_NO from tb
    )a
    cross join
    (
    select distinct DC_CODE from tb
    )b
    )a
    left join
     tb b
    on
     a.COMPANY_CD=b.COMPANY_CD and a.LINE_NO=b.LINE_NO and a.DC_CODE=b.DC_CODE
    ----------------结果----------------------------
    /*COMPANY_CD LINE_NO     DC_CODE     其他
    ---------- ----------- ----------- ------
    000        1           0           NULL
    000        2           0           其他20
    000        3           0           其他30
    000        4           0           NULL
    000        5           0           其他50
    000        1           1           其他11
    000        2           1           NULL
    000        3           1           其他31
    000        4           1           其他41
    000        5           1           其他51(10 行受影响)
     
    */
      

  5.   

    不好意思楼主,网页突然刷新了一把,不知道已经提交上了.实现方法如下
    declare @TB1 table(COMPANY_CD char(4), LINE_NO tinyint, DC_CODE tinyint, 其他 char(10))
    insert @TB1 select '000', 1, 1, '其他11' 
    union all select '000', 2, 0, '其他20' 
    union all select '000', 3, 1, '其他31' 
    union all select '000', 3, 0, '其他30' 
    union all select '000', 4, 1, '其他41' 
    union all select '000', 5, 1, '其他51' 
    union all select '000', 5, 0, '其他50'declare @TB2 table(DC_CODE1 tinyint, 其他1 char(10))
    insert @TB2 select 1, NULL
    union all select 0, NULLselect 
        COMPANY_CD
        ,LINE_NO
        ,DC_CODE1 as DC_CODE
        ,max(case when DC_CODE = DC_CODE1 then 其他 else null end) as 其他
    from
      (
        select 
            A.*
            ,B.* 
        from 
            @TB1 A
        full join 
            @TB2 B
        on
            1 = 1
      ) TT
    group by
         COMPANY_CD
        ,LINE_NO
        ,DC_CODE1
      

  6.   

    declare @TB1 table(COMPANY_CD char(4), LINE_NO tinyint, DC_CODE tinyint, 其他 char(10))
    insert @TB1 select '000', 1, 1, '其他11' 
    union all select '000', 2, 0, '其他20' 
    union all select '000', 3, 1, '其他31' 
    union all select '000', 3, 0, '其他30' 
    union all select '000', 4, 1, '其他41' 
    union all select '000', 5, 1, '其他51' 
    union all select '000', 5, 0, '其他50'declare @TB2 table(DC_CODE1 tinyint, 其他1 char(10))
    insert @TB2 select 1, NULL
    union all select 0, NULLselect 
        COMPANY_CD
        ,LINE_NO
        ,DC_CODE1 as DC_CODE
        ,max(case when DC_CODE = DC_CODE1 then 其他 else null end) as 其他
    from
      (
        select 
            A.*
            ,B.* 
        from 
            @TB1 A
        cross  join 
            @TB2 B  
      ) TT
    group by
         COMPANY_CD
        ,LINE_NO
        ,DC_CODE1
    order by
          COMPANY_CD
        ,LINE_NO
        ,其他 desc
      

  7.   


    create table tb(COMPANY_CD varchar(10),LINE_NO int,DC_CODE int,其他 varchar(10))
    insert into tb values('000', 1 ,1 ,'其他11') 
    insert into tb values('000', 2 ,0 ,'其他20') 
    insert into tb values('000', 3 ,1 ,'其他31')
    insert into tb values('000', 3 ,0 ,'其他30') 
    insert into tb values('000', 4 ,1 ,'其他41') 
    insert into tb values('000', 5 ,1 ,'其他51') 
    insert into tb values('000', 5 ,0 ,'其他50')
    go
    SELECT t.COMPANY_CD,t.DC_CODE,t.LINE_NO,tb.其他
    FROM
    (
    SELECT DISTINCT COMPANY_CD,LINE_NO,'0' AS DC_CODE FROM tb
    UNION ALL
    SELECT DISTINCT COMPANY_CD,LINE_NO,'1' AS DC_CODE FROM tb
    ) t
    LEFT JOIN tb ON tb.LINE_NO=t.LINE_NO AND tb.DC_CODE=t.DC_CODE AND tb.COMPANY_CD=t.COMPANY_CD
    ORDER BY LINE_NO