使用条件计算百分比忽略空白,如果没有值则为空或空白

问题描述 投票:0回答:1

我有一个包含 3 列的表格,想要制作百分比(“完成”除以计数列状态,不带空白),如果没有值可除,结果将变为空/空白

从这张表

团体 地区 状态
A 1
A 2 完成
A 3 完成
A 1 完成
A 2
A 3 取消
A 1 重新安排
B 1 取消
B 1 重新安排
B 2
B 2 还没有
B 3 重新安排
C 1 完成
C 2
C 3 重新安排
C 1

进入此表

团体 地区 状态完成%
A 1 100%
A 2 100%
A 3 50%
B 1 0%
B 2 0%
B 3 0%
C 1 100%
C 2
C 3 0%

有什么 SELECT SQL 查询的想法可以让我做到这一点吗?

sql
1个回答
0
投票

您需要 Case 表达式来对 STATUS 不为空的行进行计数,并对 STATUS = 'Done' 的行进行计数以获取百分比(Count() 函数中的 Case 表达式)。此外,您需要检查除数是否为 null(或 0),以避免零除错误(Outer Case 表达式)。
顺便提一句。 GRP = 'A' 和 REGION = 1 的预期结果存在计算错误(或者我遗漏了某些内容) - 应该是 50%。下面是代码:

WITH    -- S a m p l e    D a t a :
    tbl (GRP, REGION, STATUS) AS
        ( Select 'A', 1, Null From Dual Union All   
          Select 'A', 2, 'Done' From Dual Union All 
          Select 'A', 3, 'Done' From Dual Union All 
          Select 'A', 1, 'Done' From Dual Union All 
          Select 'A', 2, Null From Dual Union All 
          Select 'A', 3, 'Cancel' From Dual Union All 
          Select 'A', 1, 'Reschedule' From Dual Union All 
          Select 'B', 1, 'Cancel' From Dual Union All 
          Select 'B', 1, 'Reschedule' From Dual Union All 
          Select 'B', 2, Null From Dual Union All 
          Select 'B', 2, 'Not Yet' From Dual Union All 
          Select 'B', 3, 'Reschedule' From Dual Union All 
          Select 'C', 1, 'Done' From Dual Union All 
          Select 'C', 2, Null From Dual Union All 
          Select 'C', 3, 'Reschedule' From Dual Union All 
          Select 'C', 1, Null From Dual 
        )
--    S Q L : 
Select    GRP, REGION,
          Case  When Nvl(Count(Case When STATUS Is Not Null Then 1 End), 0) > 0
                Then Count(Case When STATUS = 'Done' Then 1 End) * 100 / Count(Case When STATUS Is Not Null Then 1 End) 
          End "DONE_PCT"
From      tbl
Group By  GRP, REGION
Order By  GRP, REGION
/*    R e s u l t : 
GRP     REGION   DONE_PCT
--- ---------- ----------
A            1         50
A            2        100
A            3         50
B            1          0
B            2          0
B            3          0
C            1        100
C            2           
C            3          0     */
© www.soinside.com 2019 - 2024. All rights reserved.