使用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而不是' - '。你能帮忙吗?
感谢。
答案 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}}