使用 count() 并在其中包含子查询

问题描述 投票:0回答:1

我有三张桌子,

events
added_events
regs

events
包含一个人可以报名参加的活动列表。每个
event_id
都是独一无二的。有两种类型的事件,注册类型(也称为注册代码)和类,通过
part_no
字段(包含“r”或“c”)进行区分。有一个
event_day
列,对于所有
null
事件,该列为
part_no = 'r'
,对于
part_no = 'c'
事件,包含课程发生的日期。由于原因,该
event_day
列的类型为
varchar
而不是
date

added_events
包含人们添加到其帐户的事件。每个人都会有一个
part_no = 'r'
注册代码和零个或多个
part_no = 'c'
类。每个人都有一个唯一的
account_id
,用于将
added_events
表中的每个条目链接回
regs
表中的注册信息。

regs
包含每个与会者的姓名、地址等。该表与此查询没有特别关系,我只是提及它,以便您知道唯一的
account_id
字段源自何处。

关于当前的问题...

很容易获得所有可用注册代码的列表:

select e.event_id as reg_code
from events e
where e.part_no = 'c'

但是我需要获取所有可用注册代码的列表,并且在该查询中,我需要计算每个注册代码已注册的课程数量,按天划分。

select  e.event_id as reg_code
       ,count(
              select *
              from added_events
              where --everyone who has the current row's reg-code and one or more part_no 'c' events on 04/25/2024
             ) as Num_att_Thu
       ,count(
              select *
              from added_events
              where --everyone who has the current row's reg-code and one or more part_no 'c' events on 04/26/2024
             ) as Num_att_Fri
       ,count(
              select *
              from added_events
              where --everyone who has the current row's reg-code and one or more part_no 'c' events on 04/27/2024
             ) as Num_att_Sat
from events e
where e.part_no = 'r'
group by e.event_id

但我不知道如何实现这一点。它似乎不想让你在 count() 中添加“select blah blah blah”语句。

如果我从

added_events
表开始,我可以像这样管理一天的计数:

select   aer.event_id as reg_code
        ,count(aer.event_id) as total_att_thu
from added_events aer
where (aer.part_no = 'r')
  and (aer.account_id in (select aethu.account_id
                          from added_events aethu
                            left join events ethu on ethu.event_id = aethu.event_id
                          where aethu.part_no = 'c'
                            and ethu.event_day = '04/25/2024'
                         )
      )
group by aer.event_id
order by aer.event_id

这样做有两个问题:1)它不一定获得所有注册代码 - 如果给定的注册代码在给定的一天没有班级参加者,则它不会出现在此列表中; 2) 这种方法显然不可能持续超过一天。

那么...有人知道我如何管理这个问题吗?

我的想法是让我的输出看起来像这样:

Reg-code  Num_att_Thu  Num_att_Fri  Num_att_Sat
A         12           27           8
B         18           52           19
C         22           65           21
D         0            12           3

etc., etc...

如果我有任何不清楚的地方,请告诉我,我会尽力使其更清楚......TIA!!

sql sql-server count subquery
1个回答
0
投票

这是解决方案——我根据原始帖子的评论拼凑而成。感谢所有评论的人!我最大的问题是尝试将子查询放入 count() 语句中。 select e.event_id as reg_code ,(select count(*) from added_events ae where ae.event_id = e.event_id and ae.account_id IN (select account_id from added_events ae left join events e on e.event_id = ae.event_id where ae.part_no = 'c' and e.event_day = '04/25/2024' ) ) as num_att_thu ,(select count(*) from added_events ae where ae.event_id = e.event_id and ae.account_id IN (select account_id from added_events ae left join events e on e.event_id = ae.event_id where ae.part_no = 'c' and e.event_day = '04/26/2024' ) ) as num_att_fri ,(select count(*) from added_events ae where ae.event_id = e.event_id and ae.account_id IN (select account_id from added_events ae left join events e on e.event_id = ae.event_id where ae.part_no = 'c' and e.event_day = '04/27/2024' ) ) as num_att_sat from events e where e.part_no = 'r' group by e.event_id order by e.event_id

如果我想变得非常奇特,我可以将 
event_day

转换为

date
类型,然后放入
FORMAT()
语句以从中取出 DOTW 并将其与 'Thu' 或 'Fri' 或 '星期六”,而不是像我那样硬编码日期,因此它适用于任何具有日期发生在星期四、星期五或星期六的课程的节目......我可能稍后会这样做......但现在它正在工作,这就是我所需要的。
再次感谢所有评论的人!

© www.soinside.com 2019 - 2024. All rights reserved.