【发布时间】:2022-01-15 08:13:53
【问题描述】:
我有以下 SQL:
WITH MYFILTER AS (
SELECT
CASE WHEN STATE IN ('A', 'B') then
case
when (NUM/DENOM - 1.0) < -0.3 then 'Less than -30%'
when (NUM/DENOM - 1.0) >= -0.3
and (NUM/DENOM - 1.0) < -0.2 then '-30% to -20%'
when (NUM/DENOM - 1.0) >= -0.2
and (NUM/DENOM - 1.0) < -0.1 then '-20% to -10%'
when (NUM/DENOM - 1.0) >= -0.1
and (NUM/DENOM - 1.0) < 0.0 then '-10% to 0%'
when (NUM/DENOM - 1.0) >= 0.0
and (NUM/DENOM - 1.0) < 0.1 then '0% to 10%'
when (NUM/DENOM - 1.0) >= 0.1
and (NUM/DENOM - 1.0) < 0.2 then '10% to 20%'
when (NUM/DENOM - 1.0) >= 0.2
and (NUM/DENOM - 1.0) < 0.3 then '20% to 30%'
when (NUM/DENOM - 1.0) >= 0.3 THEN 'At least 30%'
end
ELSE case
when (NUM/DENOM < -0.3 then 'Less than -30%'
when (NUM/DENOM >= -0.3
and (NUM/DENOM < -0.2 then '-30% to -20%'
when (NUM/DENOM >= -0.2
and (NUM/DENOM < -0.1 then '-20% to -10%'
when (NUM/DENOM >= -0.1
and (NUM/DENOM < 0.0 then '-10% to 0%'
when (NUM/DENOM >= 0.0
and (NUM/DENOM < 0.1 then '0% to 10%'
when (NUM/DENOM >= 0.1
and (NUM/DENOM < 0.2 then '10% to 20%'
when (NUM/DENOM >= 0.2
and (NUM/DENOM < 0.3 then '20% to 30%'
when (NUM/DENOM >= 0.3 THEN 'At least 30%'
end
END AS indrange
FROM MYTABLE
WHERE DENOM <> 0 AND
YEAR = 2020 AND
MONTH = 11
)
SELECT
indrange,
count (*) AS total
FROM FILTER
GROUP BY indrange
只要比率不属于某个范围(例如,我的表中没有 NUM/DENOM - 1 > 0.3 的行),那么我最终得到的结果不包括“至少 30% " 作为具有 0 值的行。相反,该行根本不存在。我将如何更改代码以使其仍包含具有相应 0 值的“至少 30%”行?换句话说,我明白了:
INDRANGE TOTAL
Less than -30% 285
-30% to -20% 1,608
-20% to -10% 7,409
-10% to 0% 164,212
0% to 10% 169,665
10% to 20% 1
但我想要这个:
INDRANGE TOTAL
Less than -30% 285
-30% to -20% 1,608
-20% to -10% 7,409
-10% to 0% 164,212
0% to 10% 169,665
10% to 20% 1
20% to 30% 0
At Least 30% 0
我该怎么做?这是 DB2。
【问题讨论】:
-
在每个范围的 1 行中的 CTE 联合中,当您从 CTE 中选择时,从每个结果中减去 1
count(*)-1问题是当您没有与 case 表达式匹配的数据时,您将没有行.确保您获得所有行;在每个可能范围的空白行中联合,但是这会将每个范围的计数增加 1...所以从 CTE 中选择的每个范围中减去 1。 -
@xQbert,我正在为如何做到这一点的语法而苦苦挣扎,你能提供一个例子吗?谢谢。
-
提供的示例。没有要测试的环境,所以我不确定我的语法是否正确。
标签: sql join group-by db2 relational-database