折叠两列的行

时间:2011-02-28 12:00:10

标签: sql sql-server tsql

我有一个大数据视图。对于包含相关信息的两列,我想折叠数据,所以我没有空白。一个例子可能会更好地表明我的意思。

    ID  Title   Column1 Column2
   -11  Row1    NULL    Anna
   -11  Row1    Lars    NULL
   -10  Row2    NULL    Thomas
    -9  Row3    Paul    NULL
    -7  Row4    Gerald  NULL
    -6  Row5    NULL    Micha
    -6  Row5    NULL    Hans
    -6  Row5    NULL    Robert
    -6  Row5    Rene    NULL
    -6  Row5    Olga    NULL
    -6  Row5    Markus  NULL
    -6  Row5    Klaus   NULL
    -6  Row5    Sascha  NULL

我想要删除空白,所以看起来像这样:

    ID  Title   Column1 Column2
   -11  Row1    Lars    Anna
   -10  Row2    NULL    Thomas
    -9  Row3    Paul    NULL
    -7  Row4    Gerald  NULL
    -6  Row5    Rene    Micha
    -6  Row5    Olga    Hans
    -6  Row5    Markus  Robert
    -6  Row5    Klaus   NULL
    -6  Row5    Sascha  NULL

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

declare @t table (ID int, Title varchar(10), Column1 varchar(10), Column2 varchar(10))
insert @t select
   -11  ,'Row1',    NULL    ,'Anna' union all select
   -11  ,'Row1',    'Lars'  ,  NULL union all select
   -10  ,'Row2',    NULL    ,'Thomas' union all select
    -9  ,'Row3',    'Paul'  ,  NULL union all select
    -7  ,'Row4',    'Gerald',  NULL union all select
    -6  ,'Row5',    NULL    ,'Micha' union all select
    -6  ,'Row5',    NULL    ,'Hans' union all select
    -6  ,'Row5',    NULL    ,'Robert' union all select
    -6  ,'Row5',    'Rene'    ,NULL union all select
    -6  ,'Row5',    'Olga'    ,NULL union all select
    -6  ,'Row5',    'Markus'  ,NULL union all select
    -6  ,'Row5',    'Klaus'   ,NULL union all select
    -6  ,'Row5',    'Sascha'  ,NULL

-- the above merely sets up a table variable @t. Replace @t in the below portion
-- with your table name. Below is the actual query

;with a as (
select *,
rn1=row_number() over (partition by title order by column1)
from @t
where column1 is not null
), b as (
select *,
rn2=row_number() over (partition by title order by column2)
from @t
where column2 is not null
)
select a.id, a.title, a.column1, b.column2, *
from a
full join b
on a.title = b.title and a.rn1=b.rn2
where coalesce(a.column1, b.column2) is not null
order by coalesce(a.title, b.title), a.rn1, b.rn2

答案 1 :(得分:-1)

select id, title, column1, column2
from my_view
where column1 is not null and column2 is not null
union
select max(id) as id, max(title) as title, column1, column2
from my_view as v1
inner join my_view as v2 on v1.id = v2.id
where column1 is null or column2 is null
group by column1, column2

order by id, title, column1, column2