SQL选择有两个条件

SQL选择有两个条件,sql,Sql,在这样一张桌子上,我想知道有多少队被访问了X次,并获得了Y枚奖牌。 到目前为止,我可以计算出有多少团队访问了X次 +------+-----------------+-------+ | TEAM | VISITS | MEDAL | +------+-----------------+-------+ | 1 | 02/02/2021 | 1 | | 1 | 04/03/2021 | 2 | | 1 | 10/04/

在这样一张桌子上,我想知道有多少队被访问了X次,并获得了Y枚奖牌。 到目前为止,我可以计算出有多少团队访问了X次

+------+-----------------+-------+
| TEAM |      VISITS     | MEDAL |
+------+-----------------+-------+
|  1   |    02/02/2021   |   1   |
|  1   |    04/03/2021   |   2   |
|  1   |    10/04/2021   |   4   |
|  2   |    13/03/2021   |   3   |
|  3   |    01/03/2021   |   1   |
|  3   |    27/04/2021   |   3   |
|  4   |    21/02/2021   |   2   |
|  4   |    14/03/2021   |   3   |
|  4   |    01/04/2021   |   4   |
+------+-----------------+-------+
有了这个,我知道有多少个团队,无论哪个团队访问过一次、两次、三次等等。。。 但是现在我怎么知道,比如说,从曾经访问过的那些人中,有多少人获得了奖牌1

预期结果将是:

有多少队被访问了三次,获得了第二枚奖牌

答案是2,因为1队和4队都是

或者说,有多少队被访问了三次,获得了第三枚奖牌

答案是1,因为只有第4队是

我应该使用内部联接吗?我可以根据我已有的查询来执行吗?

这里有一种方法:

SELECT COUNT(*) AS Team_Visit FROM
(SELECT TEAM FROM table GROUP BY TEAM HAVING COUNT(VISITS)=1);

您可以使用以下命令。这是你的电话号码


让我们介绍一些变量:

@X具体访问次数和 @你获得了一枚特别的奖牌。 声明@X INT=3; 声明@Y INT=2; 此查询将获得具有特定访问次数的团队:

声明@X INT=3; 声明@Y INT=2; 选拔队 从桌子上 分组 计数*=@X; 此查询将获得拥有特定奖牌的团队:

声明@X INT=3; 声明@Y INT=2; 选拔队 从桌子上 其中奖牌=@Y; 获取具有特定访问次数的团队的查询不能返回重复的值,但是获取具有特定访问次数的团队的查询可以返回重复的值。因此,我将使用前者作为基本查询,以便自动消除重复项

第二个查询可以组合在第一个查询中,如下所示:

声明@X INT=3; 声明@Y INT=2; 选拔队 从桌子上 选择团队中的团队位置 从桌子上 其中奖牌=@Y 分组 计数*=@X; 但是,您不希望团队值本身,而是希望团队的数量。为此,您可以将整个查询包装在一个表表达式中,并选择其结果行数,如下所示:

声明@X INT=3; 声明@Y INT=2; 选择计数* 来自精选团队 从桌子上 选择团队中的团队位置 从桌子上 其中奖牌=@Y 分组 具有计数*=@X作为T; 编辑:


顺便说一下,基本查询的全局结构与查询非常相似。然而,这个查询要短得多,因为这里使用了另一种非常聪明的机制来计算匹配团队的数量。您可能希望使用该解决方案。

另一个选项,可能更简单

with cte as
(
  select 
    team,
    medal,
    count(*) over (partition by team) as total_cnt
  from mytable
)
select
   count(distinct team) as total_teams
from cte
where total_cnt = 3
and medal = 2

我喜欢这个答案。但对于X=3和Y=2,此查询将给出两行值为2的数据。“这能以某种方式解决吗?”巴托夫兰补充道,“这是一个聪明的问题。”。我将更详细地研究它,因为我不习惯它的逻辑。我不太熟悉这种场景中窗口函数的行为。非常好我还可以按访问日期过滤吗?如果我想要相同的逻辑,但在特定的时期?在>天w<和>天之间访问X次的团队数量z@lulu是的,你可以。只需在子查询中添加访问日期,然后在最终查询中在where条件中添加访问日期范围。
with cte as
(
  select 
    team,
    medal,
    count(*) over (partition by team) as total_cnt
  from mytable
)
select
   count(distinct team) as total_teams
from cte
where total_cnt = 3
and medal = 2
;with cte as 
    (select team, count(*) as visits
    from mytable
    group by team)
select count(c.team) 
    from mytable a
    join cte c on a.team=c.team
    where c.visits=3 and medal=2