Использования 2008.SQL: Все записи из одной таблицы, и все записи из других, в том числе нулевой
Привет ребят SQL Server, У меня есть таблица под названием Language
все, что мне нужно от этой таблицы LanguageID
(1-10) ,
У меня есть другой стол под названием UserQuiz
, и мне нужны ModuleID
и COUNT()
пропущенных.
План состоит в том, чтобы показать 10 языков с 4 модулями с пропущенным количеством пользователей.
Таким образом, это будет 40 записей (LanguageIDs * ModuleIDs).
Но не все языки имеют все модули и, следовательно, не имеют записей.
Мне нужен запрос, который просто заполнит отсутствующий модуль и поместит нуль в запись для пользователя.
До сих пор я пытался ...
ОБНОВЛЕНО :: 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 раз для языка также неоднократных пользователей (COUNT). Кажется, существует только 4 значения, которые применяются к 10 языкам для модуля 1 (значение 94) и 10 для модуля 2 (значение 89) и 10 для модуля 3 (значение 104) и 10 для модуля 4 (значение 28).
Каждая запись должна отличаться, но, похоже, она применяет те же значения для всех модулей, которые являются одинаковыми.
ОБНОВЛЕНО :: 29/08/2013 @ 11:05 am (GMT).
Я забыл добавить
AND
#CrossTable.LanguageID = #userspassed.languageid
, кажется, работает теперь только собирается проверить значения являются правильными
Если у вас нет окончательного списка модулей где-то, тогда нет гарантии, что вы вернете 40 записей. Возможно, ни один пользователь не прошел эту комбинацию. Чтобы проверить это, выведите пользователей из уравнения и напишите запрос, который возвращает языки и модули. Если вы получите 40 строк, которые вы ищете, это не большой прыжок, чтобы добавить к ним пользователей. –
Вам нужно использовать 'CROSS JOIN', чтобы получить декартово произведение всех языков со всеми модулями. Подробнее см. Http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx. – MicSim
@ StephenO'Flynn Im, используя мою таблицу языков в качестве окончательной таблицы, ModuleIDs хранятся в собственной таблице, только проблема - это ее одна таблица с идентификатором модуля и именем. Итак, как я могу использовать эту таблицу, чтобы заставить usre вытащить все 40 записей? – lemunk