获取每个列中分别出现不同值的次数

时间:2014-10-02 12:46:01

标签: sql oracle11g

这是源表的样子:

╔══════╦══════╦══════╗
║ 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 ║
╚════════╩══════╩══════╩══════╝

我知道这可以成为工会,但我的表有很多列,所以我希望找到一个更优雅的解决方案。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

选择' A'作为col,        sum(解码(col1,' A',1,0))为col1,        sum(解码(col2,' A',1,0))为col2,        sum(解码(col3,' A',1,0))为col3 来自test_t

联合

选择' B'作为col,        sum(解码(col1,' B',1,0))为col1,        sum(解码(col2,' B',1,0))为col2,        sum(解码(col3,' B',1,0))为col3 来自test_t

联合

选择' C'作为col,        sum(解码(col1,' C',1,0))为col1,        sum(解码(col2,' C',1,0))为col2,        sum(解码(col3,' C',1,0))为col3 来自test_t