当sum值为零时,从case语句中获取默认值' - '

时间:2016-06-28 07:02:13

标签: sql-server sum case

我有一张如下表格,

client id   order q     order date
----------- ----------- ----------
1           0           2016-02-01
1           0           2016-05-03

当sum([order q])= 0时我希望结果是' - ',如果它返回大于零的值,我想要结果。

我尝试了以下查询,但它只返回零。

select case when sum([order q]) = 0 THEN '-' else sum([order q]) END 
from t1

帮我解决这个问题。

5 个答案:

答案 0 :(得分:1)

我相信您打算GROUP BY客户端ID值:

SELECT CASE WHEN SUM([order q]) = 0 THEN '-'
            ELSE CAST(SUM([order q]) AS VARCHAR)
       END
FROM t1
GROUP BY [client id]

答案 1 :(得分:1)

您应该将sum()转换为Varchar。试试这样,

DECLARE @T TABLE (
    clientid INT
    ,orderq INT
    ,orderdate DATE
    )

INSERT INTO @T
VALUES (
    1
    ,0
    ,'2016-02-01'
    )
    ,(
    1
    ,0
    ,'2016-05-03'
    )

SELECT CASE 
        WHEN sum(orderq) > 0
            THEN convert(VARCHAR(10), sum(orderq))
        ELSE '-'
        END as orderq
FROM @t

答案 2 :(得分:1)

由于' - '是一个字符和sum([order q])将是数字数据类型,您不能使用问题中提到的语法,您必须将两者转换为类似的数据类型。试试这个查询

SELECT CASE ISNULL(SUM([order q]), 0)
           WHEN 0
           THEN CONVERT( CHAR(1), '-')
           ELSE CONVERT(VARCHAR(20), SUM([order q]))
       END
FROM t1;

答案 3 :(得分:1)

由于订单栏的数据类型 int ,因此无效。数据类型始终设置为聚合函数中使用的列数据类型。当你在这里提到' - '内部将其转换为-0而0不能在否定显示你0

答案 4 :(得分:0)

;WITH CTE 
AS (
    SELECT CONVERT(VARCHAR(10),SUM([order q])) as c1 from t
)
SELECT 
  CASE c1 
    WHEN '0' THEN '-' 
    ELSE c1 
  END as c2 
from CTE