Oracle sql根据其他列的条件从一列中获取数据

Posted

技术标签:

【中文标题】Oracle sql根据其他列的条件从一列中获取数据【英文标题】:Oracle sql to fetch data from one column based on condition of other columns 【发布时间】:2017-08-04 00:28:05 【问题描述】:

col1 col2 col3

100 FRANCE  201604
100 FRANCE  201604
100 AUSTRALIA   201605
200 MALAYSIA    201604
300 IRELAND 201604
300 IRELAND 201605
400 SPAIN   201604
500 FRANCE  201604
500 MEXICO  201604

我正在尝试根据 col2 和 col3 的条件从 col1 获取数据。我想从 col1 中消除与 col2 没有明显组合​​的所有值。在我的情况下,100 和 500 将被淘汰。

现在我想看看每个月是否有 200,300、400 (col3)(201604 和 201605),所以只会出现 300。

我试过了

select c1,count(*),c3 from 
     (
       SELECT distinct col1 c1, col2 c2, col3
         FROM table
     ) group by c1,c3 having count(*)=1;

【问题讨论】:

一般 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。 【参考方案1】:
SELECT col1
  FROM tablex t
  GROUP BY col1
  HAVING count(distinct col2) = 1
    AND ( SELECT count(1)
            FROM tablex t2 
            WHERE t2.col1 = t.col1
              AND t2.col3 in (201604,201605)
        ) = 2

【讨论】:

【参考方案2】:

我想你想要:

select t.*
from t
where t.col1 in (select t2.col1
                 from (select t2.*, count(*) over (partition by col2, col3) as cnt
                       from t t2
                      ) t2
                 group by t2.col1
                 having max(cnt) = 1
                );

关键思想是max(t2.col1)返回唯一值,当count(*) = 1时。

这是一个 example 的工作。

【讨论】:

您的内部查询将返回 100。它将找到 100 作为 201605 Australia 的最大值。 @LAS 。 . .谢谢你。有一点一厢情愿的编程。我确定了答案。 他只想退回300。

以上是关于Oracle sql根据其他列的条件从一列中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列的位置从一组列中返回值

根据给定条件的总和范围从一列返回值

将数据从一列插入另一个表的两列的过程

Oracle SQL 数据透视表从一列变为两列

用其他表中列的唯一值数填充sql表中的列

根据其他列中的条件更新一列中的值