如图,有a,b,c3个分组,其中a、b分组weidu1-weidu5都存在空值,如何查询分组维度完整率,图中只有c分组所有维度都完整的,结果应该是1/3=0.3333,如何写sql,各位大神求教
解决方案 »
- 求解oracle 查询多行记录转换成一行显示问题
- 'a%'表示a后面任意个字,我要表示a后面就一个字,怎么表示?'a_'是不对的
- oracle SGA,PGA 内存分配,急.....
- Help!获得销量增加的门店的storeid
- 动态SQL方法4的一个问题,来自Oracle Programmer's Guide
- oracle:根据差值求新的日期
- 关于在PL/SQL中读取文件的路径的问题
- 怎么样储存图片
- 在线等待您的答复!!
- Developer中包不包含sql*form、sqlJ这之类的工具?
- Oracle Database11g怎么设置并使用外部的JDK1.8
- 硬盘大量读写temp01.dbf造成服务器卡顿
--1.假设表名为tmp
--2.SQL实现如下:
select round(count(case when c1 = c2 then 1 else null end)/count(distinct fenzu),4)
from(
select fenzu, count(weidu) as c1 ,count(val) as c2
from (select * from tmp unpivot include nulls (weidu for val in(weidu1,weidu2,weidu3,weidu4,weidu5)))
group by fenzu
)
weidu1-weidu5的数据类型不一样怎么处理呢
比如:cast(weidu1 as varchar2(xx)),长度xx根据实际情况调整。
from(
select fenzu, count(weidu) as c1 ,count(val) as c2
from (select * from (select cast(weidu1 as varchar2(40)) as weidu, cast(weidu2 as varchar2(40)) as weidu2,cast(weidu3 as varchar2(40)) as weidu3,
cast(weidu4 as varchar2(40)) as weidu4,cast(weidu5 as varchar2(40)) as weidu5 from tmp) unpivot include nulls (weidu for val in(weidu1,weidu2,weidu3,weidu4,weidu5)))
group by fenzu
)
from(
select fenzu, count(weidu) as c1 ,count(val) as c2
from (select * from (select fenzu,cast(weidu1 as varchar2(40)) as weidu1, cast(weidu2 as varchar2(40)) as weidu2,cast(weidu3 as varchar2(40)) as weidu3,
cast(weidu4 as varchar2(40)) as weidu4,cast(weidu5 as varchar2(40)) as weidu5 from tmp) unpivot include nulls (weidu for val in(weidu1,weidu2,weidu3,weidu4,weidu5)))
group by fenzu
)
WITH tab AS
(SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, NULL WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, NULL WEIDU4, NULL WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, NULL WEIDU2, 1 WEIDU3, NULL WEIDU4, NULL WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL )
SELECT SUM(decode(分组完整率,5,1,0))/COUNT(分组完整率) 整体完整率 FROM(
SELECT fenzu,SUM(fenzus)/COUNT(1) 分组完整率 FROM
(SELECT FENZU,
(DECODE(WEIDU1, NULL, 0, 1) + DECODE(WEIDU2, NULL, 0, 1) + DECODE(WEIDU3, NULL, 0, 1) + DECODE(WEIDU4, NULL, 0, 1) + DECODE(WEIDU5, NULL, 0, 1) ) FENZUS
FROM TAB) GROUP BY FENZU);
整体完整率
----------
0.33333333
WITH tab AS
(SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, NULL WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, NULL WEIDU4, NULL WEIDU5 FROM DUAL UNION ALL
SELECT 'a' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'b' FENZU, 1 WEIDU1, NULL WEIDU2, 1 WEIDU3, NULL WEIDU4, NULL WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL UNION ALL
SELECT 'c' FENZU, 1 WEIDU1, 1 WEIDU2, 1 WEIDU3, 1 WEIDU4, 1 WEIDU5 FROM DUAL )
SELECT FENZU, SUM(FENZUS) / COUNT(1) 分组完整率
FROM (SELECT FENZU,
(DECODE(WEIDU1, NULL, 0, 1) + DECODE(WEIDU2, NULL, 0, 1) +
DECODE(WEIDU3, NULL, 0, 1) + DECODE(WEIDU4, NULL, 0, 1) +
DECODE(WEIDU5, NULL, 0, 1) ) FENZUS FROM TAB)
GROUP BY FENZU;
FENZU 分组完整率
----- ----------
a 4.4
b 4
c 5赠送你一个,分组完整度计算
select (
select count(1) from(
select distinct team from te where team not in (
select team from te unpivot include nulls(
weidu for wd in (A,B,C,D,E)
)where weidu is null) )) /
(select count(1)from (select distinct team from te)) 数据完整率 from dual
(select count(distinct fenzu) as 分子 from 表 where weidu1 is not null and weidu2 is not null and weidu3 is not null and weidu4 is not null and weidu5 is not null) b