当group by在Oracle

时间:2017-07-14 23:03:27

标签: oracle

即使没有记录,我也需要一个查询来返回记录。在有记录的情况下,我只想要返回那些记录。另一方面,当没有记录时,我需要它仍然返回一条记录,但“context”列的值(GROUP BY列)等于GROUP BY列的值不符合标准和聚合函数/列的默认值(例如,0)。我尝试了一个子查询:

SELECT
  (
    SELECT
      CONTEXT,
      SUM(VAL)
    FROM
      A_TABLE
    WHERE
      COL = 'absent'
    GROUP BY
      CONTEXT
  )
FROM
  DUAL;

但子查询SELECT子句中大于一列的任何内容都无法使用“太多值”消息。

我还尝试了一个UNION(有更多的背景来更忠实地代表我的情况):

SELECT
  *
FROM
  (
    SELECT
      CONTEXT,
      SUM(VAL)
    FROM
      A_TABLE
    WHERE
      COL = 'absent'
    GROUP BY
      CONTEXT
    UNION
    SELECT
      CONTEXT,
      0
    FROM
      B_TABLE
  )
  AB_TABLE
INNER JOIN C_TABLE C -- just a table that I need to join to
ON
  C.ID = AB_TABLE.C_ID
WHERE
  C.ID     = 10
AND ROWNUM = 1  -- excludes 2nd UNION subquery result when 1st returns record;

这个确实有效但我不知道为什么因为第二个UNION子查询似乎没有与第一个明确连接(我需要第二个CONTEXT值与第一个相同的第一个CONTEXT值)不返回任何记录)。问题是当我尝试实现类似的策略时,真正的查询不会返回任何记录。我想看看是否有更好的方法来解决这个问题,并且可能让它适用于真正的查询(不包括因为它太大而且有些敏感)。

3 个答案:

答案 0 :(得分:3)

我不确定我理解这个问题,但试试吧。

我相信你说的就是这个。您有一个名为A_TABLE的表,其中包含CONTEXT, VAL, COL列(也可能是其他列)。

您希望按CONTEXT进行分组,并获得VAL的总和,但仅适用于COL = 'absent'的行。否则你想要返回一个默认值(假设为0)。

这可以通过条件聚合来完成。条件位于CASE内的SUM表达式中,而不是WHERE子句中(如您在COL='absent'过滤时所见)WHERE },子句,查询 - 超过WHERE子句 - 不知道CONTEXT值没有出现在COL = 'absent'的任何行中。

如果“默认值”为NULL,您可以这样做:

select   context, sum(case when col = 'absent' then value end) as val
from     a_table
group by context
;

如果默认值不是NULL,则诱惑可能是在总和周围使用NVL()。但是,如果VAL可能是NULL,那么即使有SUM(VAL)行,NULL也可能COL = 'absent'。为了解决这种可能性,您必须在这些情况下将总和保留为NULL,而只有在没有COL = 'absent'的行时才将值设置为0(或其他任何“默认值”)。这是一种方法。仍然是标准的“条件”聚合查询:

select   context,
         case when count(case when col = 'absent' then 1 end) > 0
              then sum(case when col = 'absent' then value end)
              else 0                 --  or whatever "default value" you must assign here
         end  as val
from     a_table
group by context
;

答案 1 :(得分:1)

以下是另一种可以处理它的方法,它可以避免另外两个表(B_TABLE和C_TABLE)。

SELECT context
  , MAX(val)
FROM (
  SELECT context
     , SUM(val) as val
  FROM a_table
  WHERE col = 'absent'
  GROUP BY context
 UNION
  SELECT context
     , 0 as val
  FROM a_table
) t
GROUP BY context

这假定您要返回的默认值为0,并且A_TABLE.VAL中的任何值都是正整数。

http://sqlfiddle.com/#!4/c6ca0/20

答案 2 :(得分:0)

SELECT b.context
     , sum(a.val)
  FROM b_table b
    LEFT OUTER JOIN a_table a
      ON    a.context = b.context
        AND a.col = 'absent'
  GROUP BY b.context