SELECT记录> 0,并且没有空值

时间:2019-06-13 22:01:21

标签: oracle oracle-sqldeveloper

我有一个查询,其中要生成包含0值的行的结果。我想排除B或C列为0的任何行。要排除这样的行,我添加了T2.A <> 0和T2.A!=0。这样做时,0值替换为空值。因此,我还添加了T2.A IS NOT NULL。

我的结果仍然会生成不需要的列(显示为空),并希望排除这些列。

SELECT
  (SELECT  
      SUM(T2.A) as prem
      FROM Table_2 T2, Table_2 T1
      WHERE T2.ENT_REF = T1.ENT_REF
      AND UPPER(T2.PER) = 'HURR' 
      AND UPPER(T2.ENT_TYPE) = 'POL'
      AND T2.Cov NOT IN ('OUTPROP','COV')
      AND T2.A <> 0
      AND T2.A IS NOT NULL
  ) as B,
  (SELECT  
      SUM(T2.A) as prem
      FROM Table_2 T2, Table_2 T1
      WHERE T2.ENT_REFE = T1.ENT_REF 
      AND UPPER(T2.PER) IN ('I', 'II', 'II') 
      AND UPPER(T2.ENT_TYPE) = 'POL'
      AND T2.Cov NOT IN ('OUTPROP','COV')
      AND T2.A <> 0
      AND T2.A IS NOT NULL
  ) as C

理想情况下,结果将来自:

+----+--------+--------+
| ID |  B     |   C    |  
+----+--------+--------+
|  1 |   24   |  123   |  
|  2 |   65   |   78   |  
|  3 |   43   |   89   |  
|  3 |    0   |    0   |  
|  4 |   95   |   86   |  
|  5 |   43   |   65   |  
|  5 | (null) | (null) |  
+----+--------+--------+

类似于以下内容:


+----+-----+-----+
| ID |  B  |  C  |  
+----+-----+-----+
|  1 |  24 | 123 |  
|  2 |  65 |  78 |  
|  3 |  43 |  89 |   
|  4 |  95 |  86 |  
|  5 |  43 |  65 |  
+----+-----+-----+

我也尝试过使用不同的值,但是我还有其他列,例如日期,每行都不同。尽管我需要包括日期,但它们对我来说并不重要,仅使值仅大于0的B和C列成为可能。我也尝试使用GROUP BY ID语句,但收到一条错误消息,指出“ ORA-00979:不是GROUP BY表达式”

3 个答案:

答案 0 :(得分:0)

我想您在正确的道路上,试图对值进行分组

为此,列(应该是不同的)将被单独保留(如以下示例中的ID),而其余列应聚合(使用minmax或您认为合适的其他任何语言。

例如,您说过您不关心某个日期列-我的意思是,您将选择其中一个-然后选择第一个(即min(date_column))。同样,其余的事情也要做。 group by子句应包含所有未聚合的列(在此示例中为id)。

select id, 
       sum(a) a, 
       sum(b) b, 
       min(date_column) date_column
from your_current_query
group by id

答案 1 :(得分:0)

您已在SELECT子句中写了所有条件。

您正面临这个问题,因为WHERE子句决定要提取的行数,而SELECT子句决定要返回的值。

在您的情况下,正在发生以下情况:

简单示例:

-- MANUAL DATA
WITH DATAA AS (
    SELECT
        1 KEY,
        'VALS' VALUE,
        1 SEQNUM
    FROM
        DUAL
    UNION ALL
    SELECT
        2,
        'IDEAL OPTION',
        2
    FROM
        DUAL
    UNION ALL
    SELECT
        10,
        'EXCLUDE',
        3
    FROM
        DUAL
)
-- QUERY OF YOUR TYPE
SELECT
    (
        SELECT
            KEY
        FROM
            DATAA I
        WHERE
            I.KEY = 1
            AND O.KEY = I.KEY
    ) AS KEY, -- DECIDE VALUES TO BE SHOWN
    (
        SELECT
            KEY
        FROM
            DATAA I
        WHERE
            I.SEQNUM = 1
            AND O.SEQNUM = I.SEQNUM
    ) AS SEQNUM -- DECIDE VALUES TO BE SHOWN
FROM
    DATAA O
WHERE
    O.KEY <= 2; -- DECIDES THE NUMBER OF RECORDS

输出:

output

如果您不想在查询中更改太多逻辑,则只需在最终查询之外使用其他WHERE子句,例如:

SELECT <bla bla bla>
FROM <YOUR FINAL QUERY>
WHERE B IS NOT NULL AND C IS NOT NULL

干杯!

答案 2 :(得分:0)

如果我理解您的查询正确,那么它将避免使用Select子句中的查询会更容易且性能更高。尝试将所有内容合并到一个查询中:

1s