2013-08-29 3 views
2

Использования 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 

, кажется, работает теперь только собирается проверить значения являются правильными

+0

Если у вас нет окончательного списка модулей где-то, тогда нет гарантии, что вы вернете 40 записей. Возможно, ни один пользователь не прошел эту комбинацию. Чтобы проверить это, выведите пользователей из уравнения и напишите запрос, который возвращает языки и модули. Если вы получите 40 строк, которые вы ищете, это не большой прыжок, чтобы добавить к ним пользователей. –

+1

Вам нужно использовать 'CROSS JOIN', чтобы получить декартово произведение всех языков со всеми модулями. Подробнее см. Http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx. – MicSim

+0

@ StephenO'Flynn Im, используя мою таблицу языков в качестве окончательной таблицы, ModuleIDs хранятся в собственной таблице, только проблема - это ее одна таблица с идентификатором модуля и именем. Итак, как я могу использовать эту таблицу, чтобы заставить usre вытащить все 40 записей? – lemunk

ответ

2

Может быть ссылка на язык на JOIN, а также. Также вам не нужен COALESCE на COUNT:

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 
+0

так же, как вы выложили, я просто вычислил его haha ​​ – lemunk

+0

Почему мне не нужен COALESCE? – lemunk

+0

Поскольку COUNT должен возвращать 0, если записей нет. COALESCE используется, когда вы хотите заменить NULL чем-то известным или конкретным. –

Смежные вопросы