2014-10-02 92 views
2

這裏是源表的樣子:獲取次數的計數發生在每列不同的值分別

╔══════╦══════╦══════╗ 
║ COL1 ║ COL2 ║ COL3 ║ 
╠══════╬══════╬══════╣ 
║ A ║ A ║ A ║ 
║ A ║ A ║ B ║ 
║ A ║ B ║ C ║ 
║ B ║ B ║ C ║ 
║ B ║ C ║ C ║ 
║ C ║ C ║ C ║ 
╚══════╩══════╩══════╝ 

我期待有這樣的結果結束了:

╔════════╦══════╦══════╦══════╗ 
║ VALUES ║ COL1 ║ COL2 ║ COL3 ║ 
╠════════╬══════╬══════╬══════╣ 
║ A  ║ 3 ║ 2 ║ 1 ║ 
║ B  ║ 2 ║ 2 ║ 1 ║ 
║ C  ║ 1 ║ 2 ║ 4 ║ 
╚════════╩══════╩══════╩══════╝ 

我知道這可以做工會,但我的桌子有很多列,所以我希望找到一個更優雅的解決方案。

+1

是否可以有0或每個列中的每個值都至少出現一次? – FuzzyTree 2014-10-02 12:55:44

+0

可能有空值,但它們也應該分組並計數。 – 2014-10-02 13:12:57

回答

1

如果所有的值出現在第一列中,你可以得到的計數通過用一個簡單的組中的第一列,並使用一個交叉連接和有條件的聚合得到的計數爲其它列

select t1.myvalues, t1.col1, 
sum(case when t2.col2 = t1.myvalues then 1 else 0 end) col2, 
sum(case when t2.col3 = t1.myvalues then 1 else 0 end) col3 
from (
    select col1 myvalues, count(*) col1 
    from Table1 group by col1 
) t1 cross join Table1 t2 
group by t1.myvalues, t1.col1 

http://sqlfiddle.com/#!4/5b35b/1

+0

我用這個方法稍作修改,以處理在第一列中不會發生的空值。謝謝! – 2014-10-02 14:36:50

0

選擇 'A' 作爲山口, 總和(解碼(COL1, 'A',1,0)),爲COL1, 總和(解碼(COL2, 'A',1,0)),爲COL2, sum(decode(col3,'A',1,0))as col3 from test_t

工會

選擇 'B' 爲COL, 總和(解碼(COL1, 'B',1,0)),爲COL1, 總和(解碼(COL2, 'B',1,0))如COL2, 總和(解碼(COL3, 'B',1,0)),爲COL3 從test_t

工會

選擇 'C' 作爲山口, 總和(解碼(COL1, 'C'作爲col1, sum(decode(col2,'C',1,0))col1, sum(decode(col3,'C',1,0))col3 from test_t