问题描述
我需要在 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,cnt_b,cnt_c,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
)
;