条件GROUP BY和其他列?

时间:2011-11-08 05:29:58

标签: sql oracle oracle10g

Insert into x (...)
select a,b,c from prq where p_a is null group by a,b,c

现在,我的要求是,如果p_a is null那么我必须按a,b,c进行分组,并且只选择a,b,c列。

但是如果p_a is not null那么,我必须将两个新列x,y分组,并选择这两列。 表x中的这些x,y列是NULLABLE。

2 个答案:

答案 0 :(得分:2)

表X必须至少包含五个列,我们可以认为这些列的名称为abcxy。< / p>

如果您正在执行单个INSERT,则需要插入所有五列。如果您正在执行多个INSERT操作,则可以插入3列然后插入5列(反之亦然)。您可能必须使用第一个备选项的select-list中的NULL值进行操作。我假设列xy是明确的INTEGER - 选择合适的类型。

第一选择

INSERT INTO x(a, b, c, x, y)
    SELECT a, b, c, MAX(CAST(NULL AS INTEGER)) AS x, MAX(CAST(NULL AS INTEGER)) AS y
      FROM pqr
     WHERE p_a IS NULL
     GROUP BY a, b, c
    UNION
    SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY x, y;

您可以在UNION第一部分的选择列表中使用GROUP BY a, b, c前面的DISTINCT替换a子句。在大多数SQL DBMS中,必须列出GROUP BY子句中select-list中的所有非聚合列。使用MAX意味着您在UNION的前半部分有xy以及下半年有abc的聚合UNION。

第二选择

INSERT INTO x(a, b, c)
    SELECT DISTINCT a, b, c
      FROM pqr
     WHERE p_a IS NULL;
INSERT INTO x(a, b, c, x, y)
    SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY x, y;

如前所述,您需要在不在GROUP BY列表中的列上进行聚合。

第三种选择

如果您的意思是必须按xy以及abc分组,那么UNION的后半部分(或第二个SELECT)简化为:

    SELECT a, b, c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY a, b, c, x, y;

或者您可以再次使用DISTINCT:

    SELECT DISTINCT a, b, c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL;

答案 1 :(得分:1)

declare @p_a datatype

select @p_a= P_a from prq

if(@p_a is null)

select a,b,c from prq group by a,b,c

else

select a,b,c from prq group by x,y