2

約 20 列と 2000 行のテーブルがあります。例:

Col1 Col2 Col3 Col4 ...
A01 22 AB 11
A01 22 AX112
A01 23 A5 11
A02 20 ABAA
A04 21 AB 11
A04 21 AU 11
A04 29 AB BA
A05 21 AB 11
AAA 111 XX 18
AAA 222 GT 1O
...

以下に基づいて、2 つの列 (Col1 と Col2) の要件を満たすすべての行とすべての列を表示する選択が必要です。

Col1 が一意の場合 - 行を表示するか、Col1 が一意でない場合は、Col1 と Col2 が同じ場合にのみすべての行を表示します。前の表から、結果を選択した後です。

Col1 Col2 Col3 Col4 ...
A01 22 AB 11
A01 22 AX112
A02 20 ABAA
A04 21 AB 11
A04 21 AU 11
A05 21 AB 11
AAA 111 XX 18
...

新しいテーブル (ソリューション) にはデータが含まれています: Col1 Col2 Col3 Col4 ...

A01 22 AB 11

A01 22 AX112

A02 20 ABAA

A04 21 AB 11

A04 21 AU 11

A05 21 AB 11

AAA 111 XX 18

...

私がこれから見ることのないものは次のとおりです。

Col1 Col2 Col3 Col4 ...

A01 2 AB 11

A02 1 ABAA

A04 2 AB 11

A05 1 AB 11

AAA 1 XX 18

...

4

2 に答える 2

3

OracleとMSSQLでは、分析関数を使用します。

select * from
(
    select
        t.* ,
        count(Col1) over (partition by Col1) as count_col1,
        count(Col2) over (partition by Col1, Col2) as count_col2
    from yourTable t
) t
where count_col1 = 1 or count_col2 > 1;

証拠として、このフィドル(Oracle)このフィドル(MSSQL)を参照してください。

于 2012-08-23T06:25:18.767 に答える
2
select * 
from table t1
join (select col1
      from table
      group by col1
      having avg(col2)=max(col2)) t2
     on t1.col1=t2.col1

私はあなたの例を見ていなかった..そしてあなたの要求は例とはわずかに異なっている. 同じものは表示されません。

この場合、答えは

select * 
from table1 t1
join (select col1,col2
      from table1
      group by col1,col2
      having count(*)>1
      union
      select col1,cast(null as varchar)
      from table1 group by col1
      having count(*)=1) t2
     on t1.col1=t2.col1 and t1.col2=isnull(t2.col2,t1.col2)

これは更新されたクエリであり、そのためのフィドルhttp://sqlfiddle.com/#!3/e944b/2/0

わかりました..もう一度更新しました:

select * 
from table1 t1
join (select col1,col2
     from table1
     group by col1,col2
     having count(*)>1
     union
     select col1,min(col2)
     from table1 group by col1
     having count(*)=1 or count(*)=count(distinct col2)) t2
     on t1.col1=t2.col1 and t1.col2=t2.col2

そしてフィドルでhttp://sqlfiddle.com/#!3/d5437/12/0

2 番目の問題にはこれで十分です。

select t3.* 
    from (select distinct col1 from table1)t1
    cross apply (select top 1 * from table1 t2 where t1.col1=t2.col1) t3

フィドル: http://sqlfiddle.com/#!3/e944b/4/0

于 2012-08-23T06:32:10.523 に答える