ISNULL在SQL中使用PIVOT

时间:2014-07-25 14:08:40

标签: sql-server pivot

使用pivot,我需要用短划线替换所有空值和0值。我开始摆脱空值:

  SELECT FunctionCode, ISNULL(Col1, '-') AS Col1, ISNULL(Col2, '-') AS Col2
  FROM
  (
    SELECT Company, FunctionCode, [Count]
    FROM MyTable
  ) AS D
  PIVOT
  (
    SUM([Count])
    FOR Company IN (Col1, Col2)
  ) PIV;

由于某种原因,NULL被替换为0而不是' - '。你能帮忙吗?

感谢。

2 个答案:

答案 0 :(得分:2)

SUM()只能对数字数据类型进行操作。

数字数据类型的higher precedence比任何文本数据类型 1

因此-被转换为数字,例如:

select CONVERT(int,'-')

生成结果0

因此,解决方案是将您的值转换为文本类型。

SELECT FunctionCode, ISNULL(CONVERT(varchar(10),Col1), '-') AS Col1,
                     ISNULL(CONVERT(varchar(10),Col2), '-') AS Col2
...

同时处理0

SELECT FunctionCode, ISNULL(CONVERT(varchar(10),NULLIF(Col1,0)), '-') AS Col1,
                     ISNULL(CONVERT(varchar(10),NULLIF(Col2,0)), '-') AS Col2
...

1 从技术上讲,这并不重要,因为ISNULL不遵循类型规则 - 它总是试图将其第二个参数转换为相同类型作为第一个。但由于问题是第一个参数的类型,因此适用相同的修复。

如果我们使用COALESCE而不是ISNULL,那么优先权就很重要,这通常是首选。

答案 1 :(得分:1)

以下是示例:

INT类型列设置破折号时,它变为0:

SELECT ISNULL( CAST(NULL AS INT), '-' )

但如果我们CAST将其VARCHAR设为SELECT ISNULL( CAST( CAST(NULL AS INT) AS VARCHAR(100)), '-' ),那么这是正常的破折号:

{{1}}