基于特定条件的选择

时间:2014-07-30 08:30:32

标签: sql oracle

从tab1中选择col1,col2,col3

rownum col1 col2 col3 
1      1    10    A
2      1    15    B
3      1    0     A
4      1    0     C
5      2    0     B
6      3    20    C
7      3    0     D
8      4    10    B
9      5    0     A
10     5    0     B

所需的输出是

col1 col2 col3 
1    10   A
1    15   B
2    0    B
3    20   C
4    10   B
5    0    A
5    0    B

col1和col2是我的查找/连接列列,如果col2具有"非零"数据然后我需要忽略/过滤记录0(在上面的例子中我需要过滤记录rownum 3 4和7)如果col2没有任何数据而不是"非零"在这种情况下,只选择带0的记录(在上面的例子中,col1的值为1和5)。

我正在尝试为此编写sql。希望我已经清楚地提到了要求,如果你需要更多的东西,请告诉我。在这种情况下似乎已经空白。

数据库 - Oracle 10g

2 个答案:

答案 0 :(得分:1)

SELECT col1,
       col2,
       col3
FROM (SELECT col1,
             col2,
             col3,
             sum(col2) OVER (PARTITION BY col1) sum_col2
      FROM tab1)
WHERE (  (   sum_col2 <> 0
         AND col2 <> 0)
      OR sum_col2 = 0)

如果col2可能是负数并且要求col2的总和具有“非零”数据,则上述情况可以正常,但是,如果要求任何col2值具有“非零”数据,那么应改为:

SELECT col1,
       col2,
       col3
FROM (SELECT col1,
             col2,
             col3,
             sum(abs(col2)) OVER (PARTITION BY col1) sum_col2
      FROM tab1)
WHERE (  (   sum_col2 <> 0
         AND col2 <> 0)
      OR sum_col2 = 0)

答案 1 :(得分:0)

SELECT t1.*
FROM tab1 t1
JOIN (SELECT "col1", MAX("col2") AS max2
      FROM tab1
      GROUP BY "col1") t2
ON t1."col1" = t2."col1"
WHERE ((max2 = 0 AND "col2" = 0)
       OR
       (max2 != 0 AND "col2" != 0))
ORDER BY "rownum"

DEMO