Sql server 获取默认值'-';当和数值为零时从case语句

Sql server 获取默认值'-';当和数值为零时从case语句,sql-server,sum,case,Sql Server,Sum,Case,我有一张像下面这样的桌子 client id order q order date ----------- ----------- ---------- 1 0 2016-02-01 1 0 2016-05-03 当和([order q])=0时,我希望结果为“-”,如果它返回大于零的值,我希望结果 我尝试了以下查询,但它只返回零 select case when sum([order q]) = 0

我有一张像下面这样的桌子

client id   order q     order date
----------- ----------- ----------
1           0           2016-02-01
1           0           2016-05-03
当和([order q])=0时,我希望结果为“-”,如果它返回大于零的值,我希望结果

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

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

请帮助我解决此问题。

我相信您打算按客户id值分组:

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

我相信您打算根据客户id值对客户进行分组:

SELECT CASE WHEN SUM([order q]) = 0 THEN '-'
            ELSE CAST(SUM([order q]) AS VARCHAR)
       END
FROM t1
GROUP BY [client id]
您应该将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
您应该将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

由于“-”是一个字符,而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;

由于“-”是一个字符,而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;

由于订单列的数据类型为int,因此将不起作用。数据类型始终设置为您在聚合函数中使用的列数据类型。当您在这里提到“-”时,它内部将其转换为-0,当0不能处于负值时,它将显示您0

,因为订单列的数据类型为int,因此它将不起作用。数据类型始终设置为您在聚合函数中使用的列数据类型。当您在这里提到“-”时,它内部将其转换为-0,而当0不能处于负值时,它将显示0