簡體   English   中英

使用自聯接的計數不正確

[英]Incorrect Count Using Self Join

我試圖獲取每個年級和每個調查年度在SurveyDatas表中每本書出現多少次的計數。

在下面的查詢中,BookId 300的Grade3列中的結果應實際上為1,但應為116。Grade4列也相同。 如果刪除Grade4 Count和JOIN,我得到58,這是116的一半,但仍然不正確。 我很懷疑我需要在這里使用Subquery而不是Left Joins,否則可能會有更有效的方法。 SQL Server公用表表達式會在這里幫助我嗎? 我從未使用過該功能。

SELECT sd.SurveyYear, sd.BookId, 
    Count(sd3.Grade) as Grade3, Count(sd4.Grade) as Grade4
FROM SurveyDatas sd
LEFT JOIN SurveyDatas sd3 on sd3.BookId = sd.BookId 
    AND sd3.SurveyYear = sd.SurveyYear 
    AND sd3.Grade = '3'
LEFT JOIN SurveyDatas sd4 on sd4.BookId = sd.BookId
    AND sd4.SurveyYear = sd.SurveyYear 
    AND sd4.Grade = '4'
GROUP BY sd.SurveyYear, sd.BookId

這是我的表結構和數據外觀,盡管輸入的數據確實比這里顯示的要多。

SurveyDataId | SurveyYear | BookId | Grade
1              2014         300      3
2              2014         300      4

您將在兩者之間得到笛卡爾積。 相反,只需使用條件聚合:

SELECT sd.SurveyYear, sd.BookId, 
       sum(case when sd.Grade = '3' then 1 else 0 end) as Grade3,
       sum(case when sd.Grade = '4' then 1 else 0 end) as Grade4
FROM SurveyDatas sd
GROUP BY sd.SurveyYear, sd.BookId;

自聯接不是必需的。

自我加入時,需要考慮所有列。 您沒有使用SurverDataID,也沒有因此獲得完整圖片。 將其包含在您的加入條件中,您將看到期望的結果。

SELECT sd.SurveyYear, sd.BookId, 
    Count(sd3.Grade) as Grade3, Count(sd4.Grade) as Grade4
FROM SurveyDatas sd
LEFT JOIN SurveyDatas sd3 on sd3.BookId = sd.BookId 
    AND sd3.SurveyYear = sd.SurveyYear 
    AND sd3.Grade = '3'
    AND sd.SurveyDataID = sd3.SurveyDataID -- Add this line
LEFT JOIN SurveyDatas sd4 on sd4.BookId = sd.BookId
    AND sd4.SurveyYear = sd.SurveyYear 
    AND sd4.Grade = '4'
    AND sd.SurveyDataID = sd4.SurveyDataID -- And also this line
GROUP BY sd.SurveyYear, sd.BookId

拍攝時遇到麻煩,我刪除了分組依據,以便可以看到所有行。 我應該看到4年級的零值,而調查是針對3年級的,這使我了解了真正的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM