max函数在有case-when子句时不起作用

km0tfn4u  于 2021-06-27  发布在  Hive
关注(0)|答案(4)|浏览(486)

我有两张table。一个如下
表a

ID, count
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

唯一的结果总是空的我很困惑。为什么?

ua4mk5z4

ua4mk5z41#

使用左连接

SELECT coalesce(max(a.count) + max(b.count),max(a.count))
   FROM a left join b a.id=b.id
n7taea2i

n7taea2i2#

因为,table b 是空的, max(b.count) 会回来的 NULL . 任何使用null的操作都会导致 NULL .
所以, max(a.count) + max(b.count) 为空。 (this is 123 + NULL which will be NULL always) . 因此,您的查询返回null。
就用一个 coalesce 每当null出现时分配一个默认值。

i2loujxw

i2loujxw3#

使用 coalesce() 函数和显式联接,避免使用分隔表名类型的旧联接方法

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

5f0d552i4#

你不需要使用 JOIN ,一个简单的 SUM 两个子查询中的任意一个子查询将为您提供所需的结果。因为你只加了 MAX(b.count) 当它是非- NULL ,我们可以一直添加,但是 COALESCE 如果是,则将其设置为0 NULL .

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)

另一种方法是 UNION 这个 count 每个表中的值:

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

请注意,如果您使用 JOIN 它一定是一个 FULL JOIN . 如果你使用 LEFT JOIN 您可能看不到表b中的所有值。例如,考虑表b有一个条目的情况: ID=4, count=456 . 一 LEFT JOINID 不会在结果表中包含此值(因为表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)

使用 FULL JOIN 你会写信的

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

相关问题