【问题标题】:ISNULL with PIVOT in SQLSQL 中带有 PIVOT 的 ISNULL
【发布时间】:2014-07-25 14:08:39
【问题描述】:

使用 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 而不是“-”。接下来我可以尝试什么?

【问题讨论】:

  • 我猜 Col1 和 Col2 是 INT 数据类型?也许也可以尝试CAST 一些VARCHAR
  • Col1和Col2的数据类型是什么
  • @Darka Col1 和 Col2 应包含 [Count] 的 SUM,即 INT。我不确定如何以及在哪里进行 CAST。
  • @DavidShochet 在您检查ISNULL的同一位置

标签: sql-server pivot


【解决方案1】:

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

数字数据类型比任何文本数据类型都具有higher precedence1

所以- 被转换为数字,例如:

select CONVERT(int,'-')

产生结果0

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

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

还处理了0s:

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

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

如果我们使用 COALESCE 而不是通常首选的 ISNULL,优先级会很重要。

【讨论】:

  • 谢谢,这行得通...请问你如何为 0 值做同样的事情?
  • NULLIF(Col1,0) 而不是这些表达式中的Col1 将首先将任何0s 转换为NULLs,然后表达式的现有剩余部分将处理它。
  • 完美!非常感谢!
【解决方案2】:

示例如下:

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

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

但是,如果我们将CAST 发送给VARCHAR,那么它是正常的破折号:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多