2012-08-17 99 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