2012-08-17 28 views
0

我在Oracle表是这样的SQL从行数据与空选择最小值值

Col Col1 Col2 Col3 ColR 
-- ---- ---- ---- ---- 
30 73 40 null -10 
60 32 null 20  40 
90 80 null null 10 
80 45 81 30  50 

我也可以在上面列设定为0,而不是空。 我需要找到Col1中,col2的,COL3的最小值忽略空或0,由上校减去填充COLR

编辑: 我写了一个CASE语句不工作,由于内部的空值我的桌子。

SELECT col,col1,col2,col3, 
    CASE 
    WHEN Col1 < Col2 AND Col1 < Col3 
    THEN Col - Col1 
    WHEN Col2 < Col1 AND Col2 < Col3 
    THEN Col - Col2 
    ELSE Col - Col3 
    END ColR 
FROM 
(SELECT col,col1, 
    CASE 
    WHEN col22 IS NULL 
    THEN NULL(i can also SET TO 0 but it will mess WITH my other calculation TO find MIN) 
     ELSE ROUND(100* ((col22)/(col44))) 
    END col2 , 
    CASE 
     WHEN col33 IS NULL 
     THEN NULL 
     ELSE ROUND(100* ((col33)/(col44))) 
    END col3 
    FROM TABLE 
) 

我刚刚在我的select查询中包含case语句。所有列值都从另一个查询填充。

+2

如果所有三列都为空(或0)会发生什么? – 2012-08-17 16:48:12

+0

50 - 40 = -10是否是错字? – 2012-08-17 16:54:52

+0

@tony -ye​​s错字。 – jero 2012-08-17 17:03:01

回答

2

这听起来像你想要的东西像

SELECT least((case when col1 is null or col1 = 0 then 999999999 else col1 end), 
       (case when col2 is null or col2 = 0 then 999999999 else col2 end), 
       (case when col3 is null or col3 = 0 then 999999999 else col3 end)) 
    FROM <<table name>> 

,其中999999999是一些数字值足够大,它永远会大于任何其他有效值。如果有可能所有三列都有NULL或0的值,那么您可能希望添加一个额外的检查,如果least函数的结果是999999999,则返回0或NULL或其他任何有意义的值。

@ X-Zero非常友好,可以将此构造的工作SQL Fiddle example放在一起。请注意,他的示例正在筛选出所有三列具有NULL或0值的行。

+2

我不知道Oracle有相关的多参数最小函数(DB2重新使用'MAX ()函数)!我会添加一个答案,但它本质上是这样的,所以有一个工作的[SQL小提琴示例](http://www.sqlfiddle.com/#!4/a9e12/3) ,完成null行忽略。 – 2012-08-17 17:17:26

+0

@ X-Zero - 谢谢你的例子!我在我的答案中添加了一个链接。 – 2012-08-17 17:23:53

+0

感谢JustinCave和X-zero,我会试一试。 – jero 2012-08-17 17:59:19

1

//如果你需要极小FROM COL1或COL(任何列)

SELECT MIN (COL1) FROM (SELECT * FROM TABLE WHERE COL1 IS NOT NULL)

能否请您详细阐述,我不能帮你这个小集合信息的实际。

1

甲骨文NVL用法:

nvl(check_expression, replacement_value) 

所以 NVL(col2,0)应该采取空那惹你的数学。

所以尝试:

CASE 
     WHEN nvl(col1,0) < nvl(col2,0) AND nvl(col1,0) < nvl(col3,0) 
     THEN Col - nvl(col1,0) 
     WHEN nvl(col2,0) < nvl(col1,0) AND nvl(col2,0) < nvl(col3,0) 
     THEN Col - nvl(col2,0) 
     ELSE Col - nvl(col3,0) 
END ColR 

编辑:以X-Zero的点,我错过了。我认为如果用9999999而不是0替换NULLS,逻辑将起作用,尽管这对于这个示例数据可能太具体而不是真实世界的解决方案。

+1

除非他想_ignore_ nulls/0 – 2012-08-17 16:59:23

+0

只要col1到col3都不会是负面的。:( – 2012-08-17 17:02:28

+0

如果这是什么OP是说,然后@科迪似乎有一个去的 – 2012-08-17 17:07:12