这是源表的样子:
╔══════╦══════╦══════╗
║ 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 ║
╚════════╩══════╩══════╩══════╝
我知道这可以成为工会,但我的表有很多列,所以我希望找到一个更优雅的解决方案。
答案 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
答案 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