SQL COUNT 列中的所有行

问题描述

我需要在 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
       )
;