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

时间:2013-04-03 14:10:33

标签: sql-server pivot coalesce

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

数据透视表

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”放在那里该项目,但如果没有。虽然我无法找到如何做到这一点。也许这是错误的做法。如果我发布一些信息,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:4)

是的,您可以在最终选择列表中使用COALESCEnull值替换为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 |