0

当我对行进行计数时(代码 #1) - 我得到了大约 880 行的正确计数。

当我按日期对计数进行分组时 - 它突然增长了大约 100(代码 #2)。

如果有人可以帮助我理解我的问题,我将不胜感激!

提前致谢!

这是表结构:

tblApplicants:

applicantID (index)   |     ApplyingForYear (nvarchar) 
------------------------------------------------------
1                           2013/14
11                          2013/14
13                          2013/14
12                          2013/14
15                          2013/14
21                          2012/13


tblApplicantSchools_shadow: 

id (index)   |    applicantID    |    updated (datetime)   |   statusID (int)   |   schoolID (int)
-----------------------------------------------------------------------------------------------------
1                   11                  2012-09-24 00:00:00.000     3                   2
1                   13                  2012-10-24 00:00:00.000     4                   2
2                   15                  2012-11-24 00:00:00.000     3                   4
3                   13                  2012-03-24 00:00:00.000     4                   3
4                   12                  2012-09-24 00:00:00.000     4                   1
5                   21                  2012-11-03 00:00:00.000     5                   2
6                   11                  2012-09-04 00:00:00.000     4                   4

代码#1(正确计数):

select count(DISTINCT [tblApplicantSchools_shadow].applicantID) as TotalAppsPerWeek FROM tblApplicants  
INNER JOIN tblApplicantSchools_shadow ON tblApplicantS.ApplicantID =   tblApplicantSchools_shadow.applicantID
WHERE ApplyingForYear = '2013/14' and [tblApplicantSchools_shadow].statusID = 4

代码#2(组,计数不正确):

select DATEADD(ww,(DATEDIFF(ww,0,[tblApplicantSchools_shadow].updated)),0) AS Datesubmitted ,count(DISTINCT [tblApplicantSchools_shadow].applicantID) as TotalAppsPerWeek FROM tblApplicants  
INNER JOIN tblApplicantSchools_shadow ON tblApplicantS.ApplicantID =   tblApplicantSchools_shadow.applicantID
WHERE ApplyingForYear = '2013/14' and [tblApplicantSchools_shadow].statusID = 4
group by DATEADD(ww,(DATEDIFF(ww,0,[tblApplicantSchools_shadow].updated)),0)
order by DATEADD(ww,(DATEDIFF(ww,0,[tblApplicantSchools_shadow].updated)),0)

期望的结果:

    Datesubmitted              TotalAppsPerWeek
    -------------------------------------------------------
    2011-11-14 00:00:00.000    1
    2012-09-24 00:00:00.000    1
    2012-10-08 00:00:00.000    3
    2012-10-22 00:00:00.000    2
    2012-10-29 00:00:00.000    2
    2012-11-05 00:00:00.000    2
    2012-11-12 00:00:00.000    5
    2012-11-19 00:00:00.000   26
    2012-11-26 00:00:00.000   106
    2012-12-03 00:00:00.000   353
    2012-12-10 00:00:00.000   298

小提琴代码: http ://sqlfiddle.com/#!3/3aa61/10

4

2 回答 2

1

您正在使用DISTINCT并且GROUP BY两者都做同样的事情。你应该使用其中之一

如果你想使用GROUP BY

然后试试这个

   GROUP BY tblApplicantSchools_shadow.applicantID

在你的第一个查询中它已经分组了tblApplicantSchools_shadow.applicantID所以我不知道你为什么在第二个查询中再次分组

编辑:

MySQL 扩展了 GROUP BY 的使用,以便您可以使用 SELECT 列表中未出现在 GROUP BY 子句中的非聚合列或计算。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。例如,您不需要在以下查询中对 tblApplicantSchools_shadow.applicantID 进行分组

In standard SQL, you would have to add tblApplicantSchools_shadow.applicantID to the GROUP BY clause. In MySQL, the name is redundant.
于 2013-03-12T09:12:46.190 回答
0

我认为这是因为distinct在第二个查询中适用于一个组,因此tblApplicantSchools_shadow.applicantID,在第一个查询中具有明显的[tblApplicantSchools_shadow].updated折叠并计为一个,但在第二个查询中它们没有,因为它们位于不同的组中。

于 2013-03-12T09:05:56.070 回答