【问题标题】:Return values based on multiple related counts基于多个相关计数的返回值
【发布时间】:2018-02-01 16:36:24
【问题描述】:

我正在寻找一个查询,该查询将返回这些帐号,其中只有一个不是所有者的个人客户,以及两个或多个也不是所有者的公司客户。

所以对于下面的数据,它应该返回 '103'。

ACCNO  CUST_ID  OWNER     TYPE
 101     ABB      N     Personal
 101     CDD      N     Personal
 101     EFF      N     Corporate
 103     GHH      N     Personal
 103     IJJ      N     Corporate
 103     KLL      N     Corporate
 103     MNN      N     Corporate
 105     OPP      Y     Personal
 105     QRR      N     Corporate
 105     STT      N     Corporate
 106     UVV      Y     Personal
 106     WXX      Y     Corporate
 107     YZZ      N     Personal
 107     XYY      N     Corporate

感觉需要进行多次计数,条件是将它们连接在一起,然后是不同的帐号,但我不知道从哪里开始。

总结一下,如果有帮助的话:

返回 count(Type=Personal and Owner=N)=1 和 count(Type=Corporate and Owner=N)>1 的帐号

【问题讨论】:

  • 我的声明措辞有误,它还应该指定没有企业客户是所有者 - 我认为现有声明将涵盖该案例,但需要明确添加。所以这两个答案都有效,但我不得不根据我的需要调整它们,因为我没有很好地指定我的问题。 :)

标签: sql oracle count


【解决方案1】:

您必须通过计数进行分组。一个例子

   select accno
from table1
where type = 'Corporate' and owner = 'N'
and accno in (
     select accno
     from table1
     where type = 'Personal' and owner = 'N'
     group by accno
     having count(*) = 1
)
group by accno
having count(*) > 1;

你可以根据你的数据在这里找到这个的 sqlfiddle: http://sqlfiddle.com/#!4/416bfb/11

【讨论】:

  • 这就是我的想法,但我永远也达不到。 :) 有没有办法用一个 select 语句来做到这一点,或者你几乎必须检查第一个条件,然后将第二个条件与第一个条件的结果进行比较?
  • 以前从未见过 sqlfiddle,看起来很有用。
【解决方案2】:

您的 OP 中的“摘要”就是答案本身。使用COUNT(CASE ...) 根据某些标准计算值并在HAVING 子句中使用它:

SELECT accno
FROM table1
WHERE owner = 'N'
GROUP BY accno
HAVING COUNT(CASE WHEN TYPE = 'Personal' THEN 1 END) = 1
AND COUNT(CASE WHEN TYPE = 'Corporate' THEN 1 END) >= 2;

【讨论】:

  • 谢谢,我有一段时间没有使用 CASE - 将尝试两种解决方案,看看哪个效果最好。
  • 谢谢,我选择了这个作为答案,因为它使我能够将条件嵌入到现有查询中。
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 2017-05-24
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多