我有三张桌子,
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!!
这是解决方案——我根据原始帖子的评论拼凑而成。感谢所有评论的人!我最大的问题是尝试将子查询放入 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' 或 '星期六”,而不是像我那样硬编码日期,因此它适用于任何具有日期发生在星期四、星期五或星期六的课程的节目......我可能稍后会这样做......但现在它正在工作,这就是我所需要的。再次感谢所有评论的人!