SQL Server:如何将COALESCE与PIVOT表一起使用?

dav*_*mcd 3 sql-server pivot coalesce

我想做的是提供一个值,如果我的数据透视表中不存在另一个值。

数据透视表

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

结果

Item    |   Bob   |   Jim   |  Carol  |  Simon
Item1        3         4                   7
Item2        2         9         1
Item3                                      5
Run Code Online (Sandbox Code Playgroud)

我要在上面的表格上尝试改进的是,如果没有编号,则显示该人是否已分配了项目。

预期结果

Item    |   Bob   |   Jim   |  Carol  |  Simon
Item1        3         4         X         7
Item2        2         9         1         X
Item3        X         X         X         5
Run Code Online (Sandbox Code Playgroud)

我有一列(上面已注释掉),如果该人被分配了该项目,则该列具有该人的名字,但是我在想COALESCE,如果用户被分配了该项目,也许可以用它来放置“ X”,否则就什么也没有。尽管我不知道如何执行此操作。也许这是错误的方法。让我知道是否提供一些信息。谢谢!

Tar*_*ryn 5

是的,您可以COALESCE在最终选择列表中使用来替换nullX

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
Run Code Online (Sandbox Code Playgroud)

请注意,根据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
Run Code Online (Sandbox Code Playgroud)

请参阅带有演示的SQL Fiddle。返回:

|  ITEM | BOB | JIM | CAROL | SIMON |
-------------------------------------
| item1 |   3 |   4 |     X |     7 |
| item2 |   2 |   9 |     1 |     X |
| item3 |   X |   X |     X |     5 |
Run Code Online (Sandbox Code Playgroud)