GROUP BY 和 CASE WHEN?
GROUP BY with CASE WHEN?
我有 table k 个:
num2 | count
aa1 | 10
aa2 | 5
bb | 2
bb | 4
cc | 80
和 table t 与:
num1 | num2
a | aa1
a | aa2
" " | bb
" " | bb
" " | cc
现在我想获得每个 num1 的 MIN 和 MAX 计数,同时将 num1 中的“”替换为 num2():
用 num2 替换 num1 中的“”(有效):
SELECT (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2)
ELSE t.num1
END) AS 'num1',
k.num2 AS 'num2',
k.count AS 'count'
--
FROM table1 AS k
--
LEFT JOIN table2 AS t
ON k.num2 = t.num2
--
WHERE k.count > 1
--
;
导致:
num1 | num2 | count
a | aa1 | 10
a | aa2 | 5
bb | bb | 2
bb | bb | 4
cc | cc | 80
但是使用 GROUP BY 获取每个 num1 的 MIN + MAX 不会:
SELECT (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2)
ELSE t.num1
END) AS 'num1',
MIN(k.count) AS 'count_MIN',
MAX(k.count) AS 'count_MAX'
--
FROM table1 AS k
--
LEFT JOIN table2 AS t
ON k.num2 = t.num2
--
WHERE k.count > 1
--
GROUP BY (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2
ELSE t.num1
END)
--
;
结果应该是:
num1 | count_MIN | count_MAX
a | 5 | 10
bb | 2 | 4
cc | 80 | 80
但是当我 运行 上面的代码时,我在 DBeaver 中得到了错误:
SQL-Error [4200]: not a valid GROUP BY expression
?
您的第二个查询没有抛出错误:“SQL-错误 [4200]:不是有效的 GROUP BY 表达式”。结果是:“ORA-00907:缺少右括号”。
SELECT CASE WHEN t.num1 = ' ' THEN
TO_CHAR(k.num2)
ELSE
t.num1
END num1
, MIN(k.count) count_MIN
, MAX(k.count) count_MAX
FROM table1 k
LEFT JOIN table2 t ON k.num2 = t.num2
WHERE k.count > 1
GROUP BY CASE WHEN t.num1 = ' ' THEN
TO_CHAR(k.num2)
ELSE
t.num1
END;
这是一个演示:
还有一些事情:
- TO_CHAR 函数 - 您需要在值
后关闭括号
- 你需要把 case when else end 放在括号内
- 您不需要将列别名放在单引号内
- COUNT - 不要将其用作列的名称
- 命名时不要使用 AS 关键字 table 别名
您可以按如下方式使用coalesce
和TRIM
函数:
SELECT COALESCE(TRIM(t.num1), t.num2) AS num1
, MIN(k.count) count_MIN
, MAX(k.count) count_MAX
FROM table1 k
LEFT JOIN table2 t ON k.num2 = t.num2
WHERE k.count > 1
GROUP BY COALESCE(TRIM(t.num1), t.num2) ;
我使用了一个简化的表达式来获得修改后的 NUM1(将单个 space 替换为 NUM2)。您必须在 SELECT 和 GROUP BY.
中使用完全相同的表达式
select nvl(nullif(t.num1, ' '), t.num2) as num1
, min(count_) as min_count
, max(count_) as max_count
from t left outer join k on t.num2 = k.num2
group by nvl(nullif(t.num1, ' '), t.num2)
order by num1
;
NUM1 MIN_COUNT MAX_COUNT
---- ---------- ----------
a 5 10
bb 2 4
cc 80 80
请注意,我在测试中使用了列名 COUNT_(带有尾随下划线); COUNT是保留关键字,不能是列名。
我有 table k 个:
num2 | count
aa1 | 10
aa2 | 5
bb | 2
bb | 4
cc | 80
和 table t 与:
num1 | num2
a | aa1
a | aa2
" " | bb
" " | bb
" " | cc
现在我想获得每个 num1 的 MIN 和 MAX 计数,同时将 num1 中的“”替换为 num2(
用 num2 替换 num1 中的“”(有效):
SELECT (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2)
ELSE t.num1
END) AS 'num1',
k.num2 AS 'num2',
k.count AS 'count'
--
FROM table1 AS k
--
LEFT JOIN table2 AS t
ON k.num2 = t.num2
--
WHERE k.count > 1
--
;
导致:
num1 | num2 | count
a | aa1 | 10
a | aa2 | 5
bb | bb | 2
bb | bb | 4
cc | cc | 80
但是使用 GROUP BY 获取每个 num1 的 MIN + MAX 不会:
SELECT (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2)
ELSE t.num1
END) AS 'num1',
MIN(k.count) AS 'count_MIN',
MAX(k.count) AS 'count_MAX'
--
FROM table1 AS k
--
LEFT JOIN table2 AS t
ON k.num2 = t.num2
--
WHERE k.count > 1
--
GROUP BY (CASE
WHEN t.num1 = ' ' THEN TO_CHAR(k.num2
ELSE t.num1
END)
--
;
结果应该是:
num1 | count_MIN | count_MAX
a | 5 | 10
bb | 2 | 4
cc | 80 | 80
但是当我 运行 上面的代码时,我在 DBeaver 中得到了错误:
SQL-Error [4200]: not a valid GROUP BY expression
?
您的第二个查询没有抛出错误:“SQL-错误 [4200]:不是有效的 GROUP BY 表达式”。结果是:“ORA-00907:缺少右括号”。
SELECT CASE WHEN t.num1 = ' ' THEN
TO_CHAR(k.num2)
ELSE
t.num1
END num1
, MIN(k.count) count_MIN
, MAX(k.count) count_MAX
FROM table1 k
LEFT JOIN table2 t ON k.num2 = t.num2
WHERE k.count > 1
GROUP BY CASE WHEN t.num1 = ' ' THEN
TO_CHAR(k.num2)
ELSE
t.num1
END;
这是一个演示:
还有一些事情:
- TO_CHAR 函数 - 您需要在值 后关闭括号
- 你需要把 case when else end 放在括号内
- 您不需要将列别名放在单引号内
- COUNT - 不要将其用作列的名称
- 命名时不要使用 AS 关键字 table 别名
您可以按如下方式使用coalesce
和TRIM
函数:
SELECT COALESCE(TRIM(t.num1), t.num2) AS num1
, MIN(k.count) count_MIN
, MAX(k.count) count_MAX
FROM table1 k
LEFT JOIN table2 t ON k.num2 = t.num2
WHERE k.count > 1
GROUP BY COALESCE(TRIM(t.num1), t.num2) ;
我使用了一个简化的表达式来获得修改后的 NUM1(将单个 space 替换为 NUM2)。您必须在 SELECT 和 GROUP BY.
中使用完全相同的表达式select nvl(nullif(t.num1, ' '), t.num2) as num1
, min(count_) as min_count
, max(count_) as max_count
from t left outer join k on t.num2 = k.num2
group by nvl(nullif(t.num1, ' '), t.num2)
order by num1
;
NUM1 MIN_COUNT MAX_COUNT
---- ---------- ----------
a 5 10
bb 2 4
cc 80 80
请注意,我在测试中使用了列名 COUNT_(带有尾随下划线); COUNT是保留关键字,不能是列名。