Oracle对分区进行了多次计数

  • 本文关键字:分区 Oracle sql oracle
  • 更新时间 :
  • 英文 :


我有以下查询,它输出以下结果:

SELECT
a,
b,
COUNT(1) count,
round(RATIO_TO_REPORT(COUNT(1)) OVER() * 100, 2) perc
FROM
t1
WHERE
condition1
GROUP BY
a,
b
ORDER BY
COUNT(1) DESC
>PERC89.374.120.99662
AB计数
纠正968272
不匹配正确526204.86
正确无值44630
正确不匹配10722
无值无值62170.57
不匹配0.06
无值不匹配2940.03

这回答了问题的原始版本。

如果我理解正确的话,你想要b的值与总计数的比值。如果是,只需直接计算比率:

SELECT a, b, COUNT(1) as count,
SUM(SUM(CASE WHEN b = 'Correct' THEN 1 ELSE ) END)) OVER () * 100.0 / COUNT(*) as perc
FROM t1
WHERE condition1
GROUP BY a, b
ORDER BY COUNT(1) DESC;

试试这个:

WITH t AS
(SELECT a, b, COUNT(1) AS cnt FROM T1 WHERE condition1 GROUP BY a, b)
SELECT DISTINCT
a,
b,
SUM(cnt) OVER (PARTITION BY A, B) COUNT,
ROUND(RATIO_TO_REPORT(cnt) OVER () * 100, 2) perc,
SUM(cnt) OVER (PARTITION BY A),
ROUND(RATIO_TO_REPORT(cnt) OVER(PARTITION BY A) * 100, 2) 
FROM t
ORDER BY 3 DESC

如果您对如何在不同级别上将聚合与分析函数组合有疑问,请将其拆分为单独的CTE

第一个CTE计算总计数和百分比,第二个CTE用于A列。

然后将这两个结果合并以获得完整的报告。

with cnt as (
select a,b, count(*) count,
round(RATIO_TO_REPORT(COUNT(1)) OVER() * 100, 2) perc
from  tab t1
where 1=1 /* some condition 1 */
group by a,b),
cnt_a as (
select a, count(*) count,
round(RATIO_TO_REPORT(COUNT(1)) OVER() * 100, 2) perc
from  tab t1
where 1=1 /* some condition 1 */
group by a )
select 
cnt.a, cnt.b, cnt.count, cnt.perc,
cnt_a.count as count_by_a,
cnt_a.perc as perc_by_a
from cnt 
join cnt_a on cnt.a = cnt_a.a
order by 3 desc;
A         B              COUNT       PERC COUNT_BY_A  PERC_BY_A
--------- --------- ---------- ---------- ---------- ----------
Correct   Correct       968272      89,37    1023624      94,48
Mismatch  Correct        52620       4,86      53282       4,92
Correct   NO VALUES      44630       4,12    1023624      94,48
Correct   Mismatch       10722 ,99           1023624      94,48
NO VALUES NO VALUES       6217 ,57              6511        ,6        
Mismatch  Mismatch         662 ,06             53282       4,92
NO VALUES Mismatch         294 ,03              6511        ,6 

我不是声称有一个简单的一次性解决方案,但这个解决方案有效。

有趣的是,为什么您在样本数据中期望例如CorrectPERC_PARTITION_BY_A的三个不同

最新更新