0

私はこのSQL結果を持っています

color    red     AA
color    red     BB
color    red     CC
color    blue    DD
color    blue    EE

次の結果を得るために、列ごとにマージする方法はありますか?

color    red     AA
                 BB
                 CC
         blue    DD
                 EE
4

2 に答える 2

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 |
于 2013-05-06T14:08:50.230 に答える
1

ここでは、ランキング関数を使用して冗長データを見つけ、case必要に応じて空白にすることができます。また、複数の「カテゴリ」または「グループ」、または実際のデータでたまたまパーティション化されているものを処理していることにも注意してください (列として表示されabここに表示されます)。

;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
于 2013-05-06T14:14:31.520 に答える