首页 > 解决方案 > SELECT Records > 0 并且没有 NULL 值

问题描述

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

我的结果仍然会产生我不需要的列,这些列显示(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 表达式'

标签: oracleoracle-sqldeveloper

解决方案


我猜你是在正确的轨道上,试图对价值观进行分组。

为了做到这一点,列(应该是不同的)将被单独保留(例如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

推荐阅读