Sql VB.NET\Query-按查询计数/分组产生不同的结果

Sql VB.NET\Query-按查询计数/分组产生不同的结果,sql,vb.net,Sql,Vb.net,我从先前问的一个问题中得到了一个问题。它工作得很好。我想计算每个学生的条目总数,并在datagridview中显示它们的总数 SELECT ID AS [STUDENT ID], FirstName AS [First Name], LastName AS [Last Name], Trai

我从先前问的一个问题中得到了一个问题。它工作得很好。我想计算每个学生的条目总数,并在datagridview中显示它们的总数

SELECT
                          ID AS [STUDENT ID],
                          FirstName AS [First Name],
                          LastName AS [Last Name],
                          TrainDate AS [Training Date], Count(*) AS TotalCount  
                     FROM 
                           ACJATTENDANCE
                     GROUP BY ID, FirstName, LastName, TrainDate, TrainDate
所以Jason Smith参加了2个不同的日子,在我的表格中有2个不同的日期条目,datagridview显示Jason的总课程数为2。David Harris参加了1节课,datagridview显示David的总课程数为1

以下是有效的查询

SELECT
        FirstName AS [First Name],
        LastName AS [Last Name],
        TrainDate AS [Training Date], Count(*) AS TotalCount
    FROM 
        ACJATTENDANCE    
    GROUP BY FirstName, LastName, TrainDate, TrainDate
在不起作用的查询中,它在datagridview中显示每个人参加的所有日期,以及每个日期的总课程数为1

SELECT
                          ID AS [STUDENT ID],
                          FirstName AS [First Name],
                          LastName AS [Last Name],
                          TrainDate AS [Training Date], Count(*) AS TotalCount  
                     FROM 
                           ACJATTENDANCE
                     GROUP BY ID, FirstName, LastName, TrainDate, TrainDate

为什么我的修改工作方式不一样

因为您按ID分组,ID(如果是正确的ID)是唯一的,这意味着每个组的大小都是1

让我们看一个人造的例子:

Animals
ID, Type
1, Cat
2, Cat
3, Cat
4, Cat
5, Dog
6, Dog
4只猫,2只狗

SELECT Type, COUNT(*) FROM Animals GROUP BY Type

Cat, 4
Dog, 2
在你的脑海中,想象一个桶上写着“猫”,另一个桶上写着“狗”。把这些行写在一张纸上,然后放进桶里。这就是分组所做的;最后,猫桶里会有4张纸,狗桶里会有2张纸。每个唯一值有一个桶:猫是一个值,狗是另一个=2个桶

现在,如果按ID分组,则每个唯一值都需要一个bucket。那是6个桶,编号为1到6,每个桶里有一张纸

如果group by中有多个子句,则最终的存储桶数量与唯一值的组合数量相同:

Animals
ID, Type, Neutered/Spayed
1, Cat, Yes
2, Cat, No
3, Cat, Yes
4, Cat, No
5, Dog, Yes
6, Dog, Yes

SELECT Type, Neutered, COUNT(*) GROUP BY Type, Neutered

Cat, Yes, 2
Cat, No, 2
Dog, Yes, 2
这一次,GROUP BY制作了3个桶,每个桶中有2份文件,因为有些猫已经绝育,有些没有,但所有的狗都已经绝育。没有“Dog/no”分组,因为所有行都没有这种组合


因此,您得到的组数是GROUPBY中指定的列数据的不同组合数。当您指定一个ID(对于每一行都是唯一的)时,您分组所依据的其他内容并不重要-如果您分组所依据的列是唯一的,则始终只能得到1的组大小

您不需要在组中指定两次TrainDate byI在第一次查询工作时出错。在我的访问表的考勤栏中,学生的日期与我的相同。因此,它看起来起作用的原因是它在计算同一日期的条目数。如果Jason Smith在2020年1月3日有4个条目,则该日期将返回4节课,如果他也在2020年2月3日上课,则其姓名将返回条目1,其姓名将返回条目4。