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ているため、2番目のクエリで再度グループ化する理由がわかりません

編集:

MySQL では GROUP BY の使用が拡張されているため、GROUP BY 句には表示されない集計されていない列または計算を SELECT リストで使用できます。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。たとえば、次のクエリでは 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

distinct2番目のクエリではグループに適用されるため、最初のクエリでtblApplicantSchools_shadow.applicantIDは明確に崩壊し、1つとしてカウントされます[tblApplicantSchools_shadow].updatedが、2番目のクエリでは異なるグループに属しているため、そうではありません。

于 2013-03-12T09:05:56.070 に答える