首页 > 解决方案 > sql计算多行课堂上的当前学生

问题描述

barcodes表中,我有两列女巫enterexit就像学生出勤记录一样,

在此表中,当学生进入课堂时,我在表中添加了新行,并且值enter与登录相同1exit0

从教室退出后,我检查了这个学生的最新行,如果enter是,1那么我在表中添加新行,其1exit与注销类似

现在我想计算所有学生女巫enter列是1exit价值是0让所有在校学生

样本数据:

在这个DB-FIDDLE中,我有示例数据,并且我有2现在的学生,session_id他们是1,他们是123451123452学生,但是我的 sql 命令作为第二部分是不正确的,并且返回一个在校学生:

(
 select count(*) 
 from barcodes b 
 where b.session_id = s.id
 group by session_id, barcode 
 having sum(exit) = 0

) as present

例如:

select s.id, s.session_name, s.session_type, s.date_time,
   (
     select count(*) 
        from barcodes b where b.session_id = s.id
    ) as barcode_count ,
    (
     select count(*) 
     from barcodes b 
     where b.session_id = s.id
     group by session_id, barcode 
     having sum(exit) = 0

    ) as present

from sessions s;

标签: mysqlsqlite

解决方案


如果我得到您想要做的正确的事情,您可以添加另一个外部聚合。

...
(SELECT sum(x.count)
        FROM (SELECT count(*) count
                     FROM barcodes b
                     WHERE b.session_id = s.id
                     GROUP BY b.session_id,
                              b.barcode
                     HAVING sum(b.enter) <> 0
                            AND sum(b.exit) = 0) x) present
...

但我认为有一种更简单的方法来获得你想要的东西,只需为会话取enter减的总和。exit由于任何带有exit = 1也带有的行enter = 1,我们需要将exit之前的减法加倍。

...
(SELECT sum(b.enter - 2 * b.exit)
        FROM barcodes b
        WHERE b.session_id = s.id) present
...

推荐阅读