我有一个包含 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 查询的想法可以让我做到这一点吗?
您需要 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 */