首页 > 解决方案 > VB.NET\Query - COUNT / GROUP BY QUERY 产生不同的结果

问题描述

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

因此,Jason Smith 参加了 2 个不同的日子,在我的表格中按日期划分为 2 个不同的条目,datagridview 显示 Jason 的总课程为 2 个。David Harris 参加了 1 节课,datagridview 显示了 1 节 David 的总课。

这是有效的查询。

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

为什么我的修改没有以同样的方式工作?

标签: sqlvb.net

解决方案


因为您按 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 分组,则每个唯一值都需要一个存储桶。那是 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”分组,因为没有任何行具有这种组合。

因此,您获得的组数是 group by 中指定的列数据的不同组合的数量。当您指定每行唯一的 ID 时,您分组的其他内容无关紧要 - 如果您按唯一的列分组,您将始终只获得 1 的组大小


推荐阅读