【问题标题】:selection based on certain condition基于特定条件的选择
【发布时间】:2014-07-30 17:45:57
【问题描述】:

从 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

【问题讨论】:

  • 请发布您的尝试。
  • 听起来您在谈论基于其他列之一在组中测试col2。你在哪一列分组?
  • 在你的第二部分,你的意思是col1 with value 2 and 5
  • @MitchWheat 我正在尝试自我加入,其中一组为零,另一组非零。然后根据主表中的负条件拉记录考虑。
  • @Barmar 需要过滤 rownum 值为 (3,4,7) 的记录

标签: sql oracle


【解决方案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)

【讨论】:

  • 在 sqlfiddle 出现错误:sqlfiddle.com/#!4/69bac/12。我的查询遇到了同样的错误。为什么col1 是无效标识符?
  • This Fiddle 有正确的@barmar ddl 列有双引号.. 所以它也必须在 dmls 中遵循..
【解决方案2】:
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

【讨论】:

  • 感谢上面的指点,我自己也做了同样的修改。
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多