Sql 当有case-when子句时,max函数不起作用

Sql 当有case-when子句时,max函数不起作用,sql,hive,Sql,Hive,我有两张桌子。 一个是如下 表a ID, count 1, 123 2, 123 3, 123 身份证,伯爵 1, 123 2, 123 3, 123 表b ID, count 身份证,伯爵 表b是空的 使用时 SELECT CASE WHEN isnotnull(max(b.count)) THEN max(a.count) + max(b.count) ELSE max(a.count) FROM a, b 选择案例 当isnotnull(max(b.count)

我有两张桌子。 一个是如下

表a

ID, count 1, 123 2, 123 3, 123 身份证,伯爵 1, 123 2, 123 3, 123 表b

ID, count 身份证,伯爵 表b是空的

使用时

SELECT CASE WHEN isnotnull(max(b.count)) THEN max(a.count) + max(b.count) ELSE max(a.count) FROM a, b 选择案例 当isnotnull(max(b.count))时,则max(a.count)+max(b.count) 其他最大值(a.计数) 从a到b 唯一的结果总是空的
我很困惑。为什么?

由于表
b
为空,
max(b.count)
将返回
NULL
。使用NULL执行的任何操作都会导致
NULL

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)
因此,
max(a.count)+max(b.count)
为空。
(这是123+NULL,它将始终为空)
。因此,您的查询返回NULL


只要使用一个
coalesce
来分配一个默认值,每当NULL出现时。

由于表
b
为空,
max(b.count)
将返回
NULL
。使用NULL执行的任何操作都会导致
NULL

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)
因此,
max(a.count)+max(b.count)
为空。
(这是123+NULL,它将始终为空)
。因此,您的查询返回NULL

只要使用一个
合并
来分配一个默认值,每当NULL出现时。

使用左连接

SELECT coalesce(max(a.count) + max(b.count),max(a.count))
   FROM a left join b a.id=b.id
使用左连接

SELECT coalesce(max(a.count) + max(b.count),max(a.count))
   FROM a left join b a.id=b.id
使用
coalesce()
函数和显式联接,避免使用分隔表名类型的旧联接方法

  select coalesce(max(a.count)+max(b.count),max(a.count))
  from a left join b on a.id=b.id
使用
coalesce()
函数和显式联接,避免使用分隔表名类型的旧联接方法

  select coalesce(max(a.count)+max(b.count),max(a.count))
  from a left join b on a.id=b.id

您不需要使用
连接
,两个子查询的简单的
求和
将得到您想要的结果。由于您仅在非空时添加
MAX(b.count)
,因此我们可以一直添加它,但
合并
空时将其合并为0

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)
另一种方法是对每个表中的
值进行
联合
计数

SELECT COALESCE(MAX(bcount), 0) + MAX(acount)
FROM (SELECT count AS acount, NULL AS bcount FROM a
      UNION
      SELECT NULL AS acount, count AS bcount FROM b) u
请注意,如果使用
连接
它必须是
完全连接。如果使用
左连接
,则可能无法看到表b中的所有值。例如,考虑表B有一个条目:<代码> ID=4,计数=456 < /代码>。
ID
上的
LEFT JOIN
将不会在结果表中包含此值(因为表A的ID值仅为1、2和3),因此您将得到错误的结果:

CREATE TABLE a (ID INT, count INT);
INSERT INTO a VALUES (1, 123), (2, 123), (3, 123);
CREATE TABLE b (ID INT, count INT);
INSERT INTO b VALUES (4, 456);
SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
LEFT JOIN b ON a.ID = b.ID
输出

123 (should be 579)
要使用
完全联接
,您需要编写

SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
FULL JOIN b ON a.ID = b.ID

您不需要使用
连接
,两个子查询的简单的
求和
将得到您想要的结果。由于您仅在非空时添加
MAX(b.count)
,因此我们可以一直添加它,但
合并
空时将其合并为0

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)
另一种方法是对每个表中的
值进行
联合
计数

SELECT COALESCE(MAX(bcount), 0) + MAX(acount)
FROM (SELECT count AS acount, NULL AS bcount FROM a
      UNION
      SELECT NULL AS acount, count AS bcount FROM b) u
请注意,如果使用
连接
它必须是
完全连接。如果使用
左连接
,则可能无法看到表b中的所有值。例如,考虑表B有一个条目:<代码> ID=4,计数=456 < /代码>。
ID
上的
LEFT JOIN
将不会在结果表中包含此值(因为表A的ID值仅为1、2和3),因此您将得到错误的结果:

CREATE TABLE a (ID INT, count INT);
INSERT INTO a VALUES (1, 123), (2, 123), (3, 123);
CREATE TABLE b (ID INT, count INT);
INSERT INTO b VALUES (4, 456);
SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
LEFT JOIN b ON a.ID = b.ID
输出

123 (should be 579)
要使用
完全联接
,您需要编写

SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
FULL JOIN b ON a.ID = b.ID

让我知道这是否有帮助。让我知道这是否有帮助。您解释得非常清楚,并且确实帮助我了解了问题的原因。非常感谢。我尝试过,似乎蜂巢不支持选择合并(从b中选择最大(计数),从a中选择最大(计数)。它总是报告我“无法识别”附近的输入选择“最大”(“在表达式规范中”@vitoyan很抱歉,我没有意识到hive是如此有限。此查询将在我熟悉的所有SQL风格中工作。我很高兴您有另一个可以工作的答案。@vitoyan请查看我的更新答案。它有几个查询将在hive中工作。它还解释了为什么您不能使用
LEFT JO在
中查询,并保证您会得到正确的结果。很抱歉这么晚才回复。感谢您如此详细的解释。是的,我不能使用“LEFT JOIN”。我尝试了您的建议,得到了预期的结果。非常感谢。您解释得非常清楚,确实帮助我了解了问题的原因。谢谢非常多。我尝试过,似乎配置单元不支持选择合并(从b中选择最大值(计数),从a中选择最大值(计数))。它总是报告我“无法识别”选择“最大值”附近的输入(“在表达式规范中”@vitoyan很抱歉,我没有意识到hive是如此有限。此查询将在我熟悉的所有SQL风格中工作。我很高兴您有另一个可以工作的答案。@vitoyan请查看我的更新答案。它有几个查询将在hive中工作。它还解释了为什么您不能使用
LEFT JO在
中进行此查询,并保证您会得到正确的结果。很抱歉这么晚才回复。感谢您如此详细的解释。是的,我不能使用“LEFT JOIN”。我尝试了您的建议,得到了预期的结果。非常感谢。