2010-05-27 10 views

Respuesta

22
CASE WHEN ISNULL(SUM(MyTable.Total), 0) <= 0 THEN 0 
    ELSE SUM(MyTable.Total) 
END AS Total 
6
CASE 
WHEN COALESCE(SUM(MyTable.Total), 0) <= 0 THEN 0 
ELSE SUM(MyTable.Total) 
END AS [Total] 
1
CASE WHEN 
    COALESCE(SUM(MyTable.Total),0) <= 0 
THEN 
    0 
ELSE 
    SUM(MyTable.Total) 
END AS Total 
+0

Por supuesto, esto no hace el SUMA en el caso else ... Tsk tsk tsk – Cobusve

0

¿Qué tal

SUM(ISNULL(MyTable.Total, 0)) AS Total 

Lo prefiero porque la implementación NULL en las bases de datos no siempre es lógica y difiere entre los proveedores y si ANSI_NULLS está habilitado o no.

E.g. SUMA es NULL, NULL y 1 se devuelve como 1, pero (1 + + NULL NULL) es igual a NULL ...

continuación, puede hacer lo menos de 0 Con el caso de que el anterior, por lo tanto

CASE 
WHEN SUM(ISNULL(MyTable.Total,0)) <= 0 THEN 0 
ELSE SUM(ISNULL(MyTable.Total,0)) 
END AS [Total] 
0

en PostgreSQL ya que no es función de IS NULL que puede hacer:

CASE WHEN SUM(MyTable.Total) > 0 THEN SUM(MyTable.Total) ELSE 0 END AS Total 
1

@ SQL.NET Guerrero, he creado una función para usted. Toma un entero como parámetro y vuelve a 0 para valores NULL o negativos.

--this statements ensure we drop the function before recreating it 
IF EXISTS(SELECT * FROM sysobjects WHERE xtype = 'FN' AND name = 'nonNullNegative') 
BEGIN 
    DROP FUNCTION dbo.nonNullNegative 
END 
GO 

--the real function definition 
CREATE FUNCTION dbo.nonNullNegative(@numValue INT) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @newValue AS INT; 
    SET @newValue= CASE WHEN ISNULL(@numValue,0)<=0 THEN 0 ELSE @numValue 
END 
    RETURN @newValue; 
END 
GO 



use MyDatabase; 

--use it like this 
SELECT dbo.nonNullNegative(-2);--outputs 0 
-3
select greatest(0, -1) FROM DUMMY 

Devuelve 0

select greatest(0, 1) FROM DUMMY 

Devuelve 1

+0

_greatest_ no existe en SQL Server – badbod99

4

sólo para ser diferente ...

ISNULL(SUM(Total) * NULLIF(SIGN(SUM(Total)), -1), 0) 
0
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Haluk Alkın Turan 
-- Create date: 2017-10-31 
-- Description: Simulates ORACLE's GREATEST Function 
-- Usage: select dbo.getGreatest(1,2) 
-- ============================================= 
CREATE FUNCTION getGreatest 
(
    @val1 sql_variant, 
    @val2 sql_variant 
) 
RETURNS sql_variant 
AS 
BEGIN 
    RETURN (SELECT MAX(i) FROM (VALUES (@val1), (@val2)) AS T(i)) 
END 
GO 
Cuestiones relacionadas