SQL聚合函数如果只有一个则返回单个值,否则返回null

时间:2013-04-09 01:02:47

标签: sql oracle11g aggregate-functions

我正在寻找实现此功能的聚合函数的最佳方法: -

  • 如果该组仅包含一个重复值,则返回该值
  • 如果该组包含任何空值,则返回null
  • 如果该组包含多个值,则返回null

以下是一些示例数据:

CREATE TABLE EXAMPLE
( ID  NUMBER(3),
  VAL VARCHAR2(3));

INSERT INTO EXAMPLE VALUES (1,'A');
INSERT INTO EXAMPLE VALUES (2,'A');
INSERT INTO EXAMPLE VALUES (2,'B');
INSERT INTO EXAMPLE VALUES (3,null);
INSERT INTO EXAMPLE VALUES (3,'A');
INSERT INTO EXAMPLE VALUES (4,'A');
INSERT INTO EXAMPLE VALUES (4,'A');

SQL应该是这样的: -

SELECT ID, ????( VAL ) ONLY_VAL
FROM EXAMPLE 
GROUP BY ID
ORDER BY ID

我所追求的结果应如下所示: -

 ID       ONLY_VAL
  1       A
  2       
  3       
  4       A

实际上,我希望在多个VAL列上执行此操作(按相同的ID分组)。每ID会有几百条记录。

我认为这是一个有趣的问题我唯一的解决方案是乱七八糟的NVL,MIN和MAX,看起来应该有一个更简洁的方式。

1 个答案:

答案 0 :(得分:2)

这适用于原始数据吗?

SELECT  ID, 
        CASE WHEN COUNT(DISTINCT VAL) = 1 AND COUNT(ID) = COUNT(VAL)
             THEN MAX(VAL)
             ELSE NULL
        END ONLY_VAL
FROM    EXAMPLE
GROUP   BY ID
ORDER   BY ID