-2

我有表 k:

num2 | count
aa1  | 10
aa2  | 5
bb   | 2
bb   | 4
cc   | 80

和表 t:

num1 | num2
a    | aa1
a    | aa2
" "  | bb
" "  | bb
" "  | cc

现在我想获取每个 num1 的 MIN 和 MAX 计数,同时用 num2 替换 num1 中的“”(如果满足 A 列中的条件,则用 B 列的值填充 A 列中的行):

用 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-错误 [4200]: 不是有效的 GROUP BY 表达式

?

4

3 回答 3

1

您的第二个查询不会引发错误:“SQL-Error [4200]: not a valid GROUP BY expression”。它导致:“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;

这是一个演示:

演示

还有几件事:

  1. TO_CHAR 函数 - 您需要在值之后关闭括号
  2. 当 else 在括号内结束时,您需要放置 case
  3. 您不需要将列别名放在单引号内
  4. COUNT - 不要将其用作列的名称
  5. 命名表别名时不要使用 AS 关键字
于 2020-12-03T15:34:02.020 回答
0

我使用了一个简化的表达式来获得修改后的 NUM1(用 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 是保留关键字,不能是列名。

于 2020-12-03T15:50:46.397 回答
0

您可以按如下方式使用coalesceand函数: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) ;
于 2020-12-03T15:44:46.270 回答