SQL:来自一个表的所有记录,以及来自另一个表的所有记录,包括null

时间:2013-08-29 08:24:03

标签: sql sql-server-2008

使用SQL Server 2008。

大家好,我有一张名为Language的桌子我需要的是LanguageID(1-10)。 我有另一个名为UserQuiz的表,我需要ModuleIDCOUNT()通过。
该计划是显示10种语言,包含4个模块,用户通过计数。

所以这将是40条记录(LanguageIDs * ModuleIDs) 但并非所有语言都包含所有模块,因此没有任何记录。

我需要一个只填写缺失模块的查询,并将null放在usercount的记录中。

到目前为止,我已经尝试过了......

更新:: 29/08/2013 @ 10:35 am(GMT)。

CREATE TABLE #CrossTable(
LanguageID int,
ModuleID int
)
INSERT INTO #CrossTable
SELECT LanguageID, ModuleID 
FROM 
RoundupAcademy.dbo.Languages
CROSS JOIN
RoundupAcademy.dbo.CurrentModules
/*********************************************************************************/

/** get users via date and quiz **************************************************/
CREATE TABLE #userspassed(
userid int,
passed int,
moduleid int,
languageid int
)
INSERT INTO #userspassed
SELECT userprofile.UserId, passed, userquiz.moduleID, LanguageId
FROM 
UserProfile
LEFT JOIN 
UserQuiz
ON
UserProfile.UserId = UserQuiz.userID
WHERE
((Convert(datetime,LastLogin, 120) >= 
    Convert(datetime,@datefrom, 120) 
AND (Convert(datetime,LastLogin, 120) <= 
        convert(datetime,@datetoo, 120))))
AND
(passed is null or passed = 1)
/*********************************************************************************/

/**Get Modules per language count on users passed ********************************/
SELECT 
#CrossTable.languageID, 
#CrossTable.ModuleID,
coalesce(COUNT(#userspassed.userID),0) as users 
FROM 
#CrossTable
LEFT JOIN
#userspassed
ON 
#CrossTable.ModuleID = #userspassed.moduleID
GROUP BY #CrossTable.LanguageID, #CrossTable.ModuleID

/*********************************************************************************/

这确实带回了40条记录,但是对于语言重复10次的模块“n”也重复了用户(计数)。似乎只有4个值应用于模块1的10种语言(值94)和10用于模块2(值89)和10用于模块3(值104)和10用于模块4(值28)。

每条记录应该不同,但似乎它将相同的值应用于所有相同的模块。

更新:: 29/08/2013 @ 11:05 am(GMT)。

我忘了添加

AND 
#CrossTable.LanguageID = #userspassed.languageid

现在似乎正在检查值是否正确

1 个答案:

答案 0 :(得分:2)

也许链接到JOIN上的语言。此外,你不应该在COUNT上使用COALESCE:

SELECT 
    #CrossTable.languageID, 
    #CrossTable.ModuleID,
    COUNT(#userspassed.userID) as users 
FROM 
    #CrossTable
LEFT JOIN
    #userspassed ON 
      #CrossTable.LanguageID = #userspassed.languageid
      AND #CrossTable.ModuleeID = #userspassed.moduleid
GROUP BY #CrossTable.LanguageID, #CrossTable.ModuleID