2015-12-18 6 views
0

Я пытаюсь выполнить SQL Pivot, он отлично работает, когда есть данные в главной таблице, которую я пытаюсь выполнить. Я упростил свою проблему для набора данных пользователей, предметов, результатов. Я хочу показать таблицу с предметами как строки с пользователями как столбцы и их результаты для тех объектов в ячейках. Он должен показывать всех Пользователей, даже если у них нет результатов, и все Субъекты даже без результатов. У меня есть работа, за исключением случаев, когда результатов нет, и ничего не возвращает. Я хочу, чтобы он все еще показывал строки и столбцы, но только с нулями в ячейках, Любые идеи?MS SQL Pivot Tables: Empty Source

См SQL Скрипки Пример http://sqlfiddle.com/#!6/a1f9e/1

Обновлено

This is how it should look when there are no results

+0

Итак, каков ваш желаемый результат? –

+0

Выберите ISNULL (p.subjectid, 0), ISNULL (p.Name, ''), ISNULL (p.UserID), ISNULL (p.ResultFrom, 0) (ваш код) – mohan111

+0

Не уверен, что я следую @ mohan111 –

ответ

0

Вы должны изменить свой запрос на это:

set @query = ' 
Select * From (
SELECT Subjects.ID, Subjects.Name, Results.UserID, Results.Result 
from Subjects 
Left Outer join Results 
On Results.SubjectID = Subjects.ID 
) x pivot (max(Result) for UserID in (' + @cols + ')) p' 

Вам нужно левое внешнее соединение включает не -Матчи. Я также поменял местами таблицы, поэтому результаты объединяются с Субъектами, но, как указано в комментариях, это вопрос предпочтения. Главное, что вам нужно выбрать Subjects.Id, а не ID в таблице Results, которая ничего не вернет в случае несоответствия.

+0

В этом Я уверен, что «A Left Join B» и «B Right Join A» эквивалентны. Проблема заключалась в том, что он использовал ObjectsId вместо ID, а это означало, что у него нет идентификатора, когда не было совпадений. –

+0

Правильно, но меня всегда учили использовать левый внешний, так что это просто вопрос предпочтения. Я отредактировал свой ответ, чтобы указать ваш комментарий. –

+0

Спасибо всем, Results.Subject ID был на самом деле опечаткой при упрощенном примере, но это помогло мне увидеть, где я ошибся, как с моим фактическим кодом, так спасибо! Мой фактический код перекрестно ссылался на ту же таблицу 3 раза по разным причинам (группа, требующая поиска определенного экземпляра строки), и некоторые из объединений были неустойчивыми. Разбивая его, чтобы сделать пример, я понял, почему он не работает! –