【问题标题】:subquery select when group by is null当 group by 为空时选择子查询
【发布时间】:2017-01-27 05:39:45
【问题描述】:

我有一个不知道的问题。

SELECT (
  SELECT COUNT(bar.id)
  FROM bar
  WHERE foo.some_id = bar.some_id
  ) AS num_bar
  FROM foo
  GROUP BY some_id

如果 foo 看起来像这样:

ID|some_id
----------
1 |NULL
2 |apple
3 |orange

bar 看起来像这样

ID|some_id
----------
1 |NULL
2 |apple
3 |orange
4 |NULL
5 |apple
6 |orange

我希望它会返回:

num_bar
-------
2
2
2

但是,NULL分组的计数每次返回0。

当 group by 为 NULL 时,说明此 WHERE 子句的正确方法是什么?

【问题讨论】:

    标签: sql postgresql group-by subquery


    【解决方案1】:

    SQL 聚合函数和比较可能会在其计算中忽略 NULL 值

    您可能想要做的是给它一个值,然后相应地解释空值。因此,在下面的查询中,您要求查询将空值解释为 -1。

    SELECT (
     SELECT COUNT(bar.id)
     FROM bar
     WHERE isnull(foo.some_id, -1) = isnull(bar.some_id,-1)
    ) AS num_bar
    FROM foo
    GROUP BY isnull(some_id,-1)
    

    【讨论】:

      【解决方案2】:

      与 Nagendra Kakarla 逻辑相同的更好方法

      SELECT  F.some_id ,COUNT(1) AS count_someid
      FROM FOO F
      INNER JOIN BAR B ON ISNULL(F.some_id,'#') = ISNULL(B.some_id,'#')
      GROUP BY F.some_id
      

      你会得到类似的结果

      +---------+--------------+
      | some_id | count_someid |
      +---------+--------------+
      | NULL    |            2 |
      | apple   |            2 |
      | orange  |            2 |
      +---------+--------------+
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,您想将bar 表中的some_idNULL's 一起计算。

        不要在count 聚合中使用some_id,如count(some_id)。当 some_id 为 NULL 时,它将忽略 NULL 值并始终返回零。

        试试这个方法

        SELECT F.some_id,
               Count(1) AS count_someid
        FROM   foo F
               INNER JOIN bar B
                       ON F.some_id = B.some_id
                           OR ( F.some_id IS NULL AND B.some_id IS NULL ) -- To join NULL records
        GROUP  BY F.some_id 
        

        some_id 中出现的NULL's 也将单独分组并计数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多