2013-04-03 3 views
3

То, что я пытаюсь сделать, это предоставить значение, если другое значение не существует в моей сводной таблице.SQL Server: как я могу использовать COALESCE с таблицей PIVOT?

Сводная таблица

SELECT * 
    FROM MyTable 
PIVOT (MAX(Number) for Total in ([Bob], [Jim], [Carol], [Simon])) as MaxValue 

Результат

Item | Bob | Jim | Carol | Simon 
Item1  3   4     7 
Item2  2   9   1 
Item3          5 

То, что я пытаюсь улучшить на вышеприведенной таблице, чтобы показать, если человек был назначен пункт, если есть там нет номера.

Ожидаемый результат

Item | Bob | Jim | Carol | Simon 
Item1  3   4   X   7 
Item2  2   9   1   X 
Item3  X   X   X   5 

У меня есть столбец (комментировали выше), который имеет имя человека, если человек был назначен этот пункт, но я думал, может быть, я мог бы использовать COALESCE, чтобы поместить " X ", если пользователю был назначен элемент, но ничего, если нет. Хотя я не могу узнать, как это сделать. Возможно, это неправильный подход. Дайте мне знать, если я дам некоторую информацию. Благодаря!

ответ

4

Да, вы можете использовать COALESCE на окончательном списке выбора для замены null значения с X:

SELECT Item, 
    coalesce([Bob], 'X') Bob, 
    coalesce([Jim], 'X') Jim, 
    coalesce([Carol], 'X') Carol, 
    coalesce([Simon], 'X') Simon 
FROM MyTable 
PIVOT 
(
    MAX(Number) 
    for Total in ([Bob], [Jim], [Carol], [Simon]) 
) as MaxValue 

Примечание, в зависимости от типа данных в Total колонке, вы, возможно, придется бросить/преобразовать , поэтому вы можете заменить null на строку.

Если вы должны были преобразовать тип данных, запрос будет:

SELECT Item, 
    coalesce(cast([Bob] as varchar(10)), 'X') Bob, 
    coalesce(cast([Jim] as varchar(10)), 'X') Jim, 
    coalesce(cast([Carol] as varchar(10)), 'X') Carol, 
    coalesce(cast([Simon] as varchar(10)), 'X') Simon 
FROM MyTable 
PIVOT 
(
    MAX(Number) 
    for Total in ([Bob], [Jim], [Carol], [Simon]) 
) as MaxValue 

См SQL Fiddle with Demo. Это возвращает:

| ITEM | BOB | JIM | CAROL | SIMON | 
------------------------------------- 
| item1 | 3 | 4 |  X |  7 | 
| item2 | 2 | 9 |  1 |  X | 
| item3 | X | X |  X |  5 | 
+0

+1 за то, что ... это стареет – Kermit

+0

Спасибо, отлично работает! – daveomcd