2013-05-06 4 views

ответ

6

Это, как правило, то, что вы могли бы сделать на уровне представления вашего приложения, но если вы хотите сделать это в SQL, вы можете использовать row_number():

select 
    case when col1rn = 1 then col1 else '' end col1, 
    case when col2rn = 1 then col2 else '' end col2, 
    col3 
from 
(
    select col1, col2, col3, 
    row_number() over(partition by col1 order by col1, col2, col3) col1rn, 
    row_number() over(partition by col1, col2 order by col1, col2, col3) col2rn 
    from yt 
) d; 

См SQL Fiddle with Demo. Вы бы заменить from yt с вашим запросом, давая результат:

| COL1 | COL2 | COL3 | 
----------------------- 
| color | blue | DD | 
|  |  | EE | 
|  | red | AA | 
|  |  | BB | 
|  |  | CC | 
| test | blue | CC | 
|  | red | AA | 
|  |  | BB | 
1

Здесь мы используем функцию ранжирования, чтобы найти избыточные данные, а затем case может пустой его по мере необходимости. Обратите также внимание на то, что мы обрабатываем несколько «категорий» или «групп» или как вам будет разбиваться по вашим реальным данным (здесь показаны столбцы a и b здесь).

;with cte as (
    select 'color' as a, 'red' as b, 'AA' as c 
    union all select 'color', 'red', 'BB' 
    union all select 'color', 'red', 'CC' 
    union all select 'color', 'blue', 'DD' 
    union all select 'color', 'blue', 'EE' 
    union all select 'smell', 'bad', 'AA' 
    union all select 'smell', 'bad', 'BB' 
    union all select 'smell', 'bad', 'CC' 
    union all select 'smell', 'good', 'DD' 
    union all select 'smell', 'good', 'EE' 
) 
select case when row_number() over (partition by a order by b, c) = 1 then a else '' end as ColA 
    , case when row_number() over (partition by a, b order by c) = 1 then b else '' end as ColB 
    , c as ColC 
from cte 
order by a, b, c 

Это даст следующий результат:

ColA ColB ColC 
----- ---- ---- 
color blue DD 
      EE 
     red AA 
      BB 
      CC 
smell bad AA 
      BB 
      CC 
     good DD 
      EE 
Смежные вопросы