使用SQL Server 2008。
大家好,我有一张名为Language
的桌子我需要的是LanguageID
(1-10)。
我有另一个名为UserQuiz
的表,我需要ModuleID
和COUNT()
通过。
该计划是显示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
现在似乎正在检查值是否正确
答案 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