我需要计算所有行并将其写入ORACLE SQL中的列。它看起来应该是这样的(左边的,右边的):
|A|B|C|D| |A|COUNT_A|B|COUNT_B|C|COUNT_C|D|COUNT_D|
- - - - - ------- - ------- - ------- - -------
|1|2|3| | ==> |1| 2 |2| 3 |3| 3 | | 0 |
|1|3|4| | ==> |1| 2 |3| 3 |4| 3 | | 0 |
| |3|4| | | | 2 |3| 3 |4| 3 | | 0 |
我尝试过COUNT(*) OVER (PARTITION BY), UNION等等
提前谢谢你。
您可以使用窗口函数:
select a, count(a) over () as cnt_a,
b, count(b) over () as cnt_b,
c, count(c) over () as cnt_c,
d, count(d) over () as cnt_d
from t;
可以通过聚合查询和交叉连接来实现。如果你有大量的数据,将其与Gordon Linoff的答案中所示的分析函数方法进行比较将会很有趣;聚合方法从基表读取数据两次(这将花费更多的时间),但是聚合函数的计算速度比分析函数快得多,即使它们做同样的事情。
像这样:
select a, cnt_a, b, cnt_b, c, cnt_c, d, cnt_d
from t cross join
( select count(a) cnt_a, count(b) cnt_b, count(c) cnt_c, count(d) cnt_d
from t
)
;