0

列の特定の値を考慮するためだけに group by を使用する方法

例えば

列に のような値があり、merge_ind = 'Y' または null のレコードのみをグループ化したい場合、N の場合、レコードは別の値として扱われるべきです

Merge1  Merge2  
A   Y  
A   Y  
A   Y  
B   Y  
B   Y  
B   Y    
C   N  
C   N  
C   N  
D   N  
D   N  
E   null  
E   null  
F   null  
F   null  
null    null  

o/p は

count   Merge1  merge2  
3   A   Y   
3   B   Y  
1   C   N  
1   C   N  
1   C   N  
1   D   N  
1   D   N  
2   E   null  
1   F   null  
1   null    null

ユニオンを使用して実装しましたが、パフォーマンスにあまり満足していません。

ありがとう
アリ

4

3 に答える 3

3

次のようなことができます:

SQL>  with data as (select 'A' Merge1, 'Y' Merge2 from dual union all
  2  select 'A', 'Y' from dual union all
  3  select 'A', 'Y' from dual union all
  4  select 'B', 'Y' from dual union all
  5  select 'B', 'Y' from dual union all
  6  select 'B', 'Y' from dual union all
  7  select 'C', 'N' from dual union all
  8  select 'C', 'N' from dual union all
  9  select 'C', 'N' from dual union all
 10  select 'D', 'N' from dual union all
 11  select 'D', 'N' from dual union all
 12  select 'E', null from dual union all
 13  select 'E', null from dual union all
 14  select 'F', null from dual union all
 15  select 'F', null from dual union all
 16  select null, null from dual)
 17  select merge1, max(merge2), count(*)
 18    from (select merge1, merge2,
 19                 case when merge2 = 'Y' or merge2 is null then merge2 else to_char(rownum) end grp
 20            from data)
 21   group by merge1, grp
 22   order by merge1;

M M   COUNT(*)
- - ----------
A Y          3
B Y          3
C N          1
C N          1
C N          1
D N          1
D N          1
E            2
F            2
             1

テスト フィドル: http://sqlfiddle.com/#!4/b85cc/1

于 2013-02-04T11:44:44.547 に答える
1

試す:

select Merge1, Merge2, count(*)
from table1
group by Merge1, Merge2, case when Merge2 = 'N' then to_char(rownum) else Merge2 end
order by Merge1

ここにsqlfiddleのデモがあります

于 2013-02-04T12:09:28.677 に答える
1

かなりいじった後、仕事をするクエリがありますが、この質問はもともと mysql とタグ付けされていたと断言できますが、残念ながらこれは mysql のみの回答です。

select count, merge1, merge2
from (
  select count(*) count, merge1, merge2,
  if(merge2 = 'Y' or merge2 is null, 0, n)
  from (
    select merge1, merge2,
    (@n := if(@n is null, 1, @n + 1)) n
    from t
  ) x
  group by 2, 3, 4
) y

Y 以外の値は、独自のグループを持つ別の値として扱われます。

各行に一意の番号を割り当てることで機能し、値が Y でない場合はそれによって選択的にグループ化し、Y 以外の行ごとに個別のグループを作成します。

これは、 daraを実行するこのクエリのsqlfiddleです。

于 2013-02-04T11:44:43.187 に答える