如何在oracle中获取重复值

时间:2014-02-17 07:54:00

标签: oracle

您好我使用左连接从各种表中选择了以下列,我得到以下结果。

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

11      JE 1        115    2/27/2014    
11      JE 2        80     2/27/2014              3/6/2014
11      JE 4        60     2/17/2014    
11      JE 3

如果PROM_CLOSEDATE有一些值,则应该再次显示等效的BOX_NAME(JE2),并显示空值和null effdate。我们可以为不同的周期时间输入任何其他不同的值。 这是实际要求。结果应该是:

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

    11      JE 1        115    2/27/2014    
    11      JE 2        80     2/27/2014              3/6/2014
    11      JE 2                          
    11      JE 4        60     2/17/2014    
    11      JE 3

就像我必须得到的价值。

这里我按照san的指导使用了

SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
  FROM tab
UNION
SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
 FROM tab
WHERE PROM_CLOSEDATE IS NOT NULL
order by 2

但我希望结果更准确。当我输入JE2(第二次)Occurance的值和生效日期(不给CLOSE_DATE)时,那时我得到以下输出。

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

        11      JE 1        115    2/27/2014    
        11      JE 2        80     2/27/2014              3/6/2014
        11      JE 2        90     4/6/2014           
        11      JE 2                          
        11      JE 4        60     2/17/2014    
        11      JE 3

但实际上,当BOX_NAME(此处为JE2)记录没有Closedate时,我不需要具有NULL值的记录,NULL生效日期,NULL关闭。 我只需要有closeate的记录是非NULL的情况。即使它有价值,生效日期和没有关闭的记录,也不应该出现空记录。 这是我的要求。请帮我解答。

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用union all

WITH tab(Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE) AS (
SELECT 11,'JE 1',115,'2/27/2014', NULL FROM dual UNION ALL   
SELECT 11,'JE 2', 80,'2/27/2014','3/6/2014' FROM dual UNION ALL
SELECT 11,'JE 2', 90,'2/28/2014','3/7/2014' FROM dual UNION ALL
SELECT 11,'JE 4', 60,'2/17/2014', NULL  FROM dual UNION ALL    
SELECT 11,'JE 3', NULL, NULL, NULL  FROM dual)
----------
--End of data preparation
----------
SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
  FROM tab
UNION
SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
 FROM tab
WHERE PROM_CLOSEDATE IS NOT NULL
order by 2

输出:

| BOX_ID | BOX_NAME |  VALUE | PROM_EFFDATE | PROM_CLOSEDATE |
|--------|----------|--------|--------------|----------------|
|     11 |     JE 1 |    115 |    2/27/2014 |         (null) |
|     11 |     JE 2 |     80 |    2/27/2014 |       3/6/2014 |
|     11 |     JE 2 | (null) |       (null) |         (null) |
|     11 |     JE 3 | (null) |       (null) |         (null) |
|     11 |     JE 4 |     60 |    2/17/2014 |         (null) |

答案 1 :(得分:1)

SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
  FROM tab
UNION
SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
 FROM tab
WHERE (PROM_CLOSEDATE IS NOT NULL 
AND PROM_EFFDATE IS NOT NULL) AND
(PROM_CLOSEDATE IS NULL 
AND PROM_EFFDATE IS NOT NULL)
order by 2

此代码可以使用