2013-02-04 48 views
0

組通過現場對我們如何使用組只考慮某一列的某個值的特定值

如果列值等,我只希望集團與記錄merge_ind = 'Y' 或零,如果是說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 

我使用union實現它,但對性能不是很滿意。

感謝
阿里

+2

爲什麼是F,空計數1?輸入與E相同,輸出2 – Bohemian

回答

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行創建一個單獨的組。

這是一個sqlfiddle與此查詢運行您的dara。

+0

認爲您錯過了OP要求具有C/N和D/N的多個結果,每個結果的'count'爲1;以及A/Y和B/Y的實際計數。 –

+0

如果您在Merge2中爲不想合併的記錄設置「null」,這應該可行。 –

+1

@AlexPoole相當如此。我終於弄明白了 - 看編輯 – Bohemian

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

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 

Here is a sqlfiddle demo

相關問題