我一直盯着那么多SQL代码,我的大脑几乎已经糊涂了。
我会快点。下面是我的表结构,省略了不相关的列:
attendance_history: member_info:
_____________________ ________________________
| Date | ID | | ID | Design Team |
|----------|--------| |--------|-------------|
| 1/27 | 1 | | 1 | DT1 |
| 1/28 | 1 | | 2 | DT2 |
| 1/29 | 2 | | 3 | DT2 |
| 1/29 | 3 | |--------|-------------|
|----------|--------|
我的最终目标是获得每个设计团队的出勤率。但我相信除了一部分外,我已经完成了所有的逻辑:我需要获得每个设计团队的参与者数量。
这是我需要的一个例子:
__________________________________
| Date | Design Team | Count |
|----------|-------------|-------|
| 1/27 | DT1 | 1 |
| 1/28 | DT1 | 1 |
| 1/29 | DT1 | 0 |
| 1/27 | DT2 | 0 |
| 1/28 | DT2 | 0 |
| 1/29 | DT2 | 2 |
|----------|-------------|-------|
关于如何实现这一目标的任何线索?目前我有一个可笑的长脚本,只有在有人在场时才能获得设计团队的计数。如果那天没有人出现在那个团队中,我需要以某种方式获得一个连续计数的0。
一如既往地感谢你。
答案 0 :(得分:4)
要获得零,需要一些技巧。您需要首先生成所有行(使用cross join
),然后在出勤信息中生成left join
:
select d.date, dt.design_team, coalesce(ddt.cnt, 0) as cnt
from (select distinct design_team from member_info) dt cross join
(select distinct date from attendance_history) d left outer join
(select ah.date, mi.design_team, count(*) as cnt
from attendance_history ah join
member_info mi
on ah.id = mi.id
group by ah.date, mi.design_team
) ddt
on ddt.design_team = dt.design_team and ddt.date = d.date;
编辑:修复了要加入的子查询啊.id = mi.id而不是ah.id = ah.id。