要排除NULL或值0的SQL

要排除NULL或值0的SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下面的SQL代码 SELECT s.[CusNo] Supp, RTRIM(CAST(s.[Customer] AS VARCHAR(50))) AS Name, s.[ConNo] Con, RTRIM(CAST(s.[ConN] AS VARCHAR(50))) AS ConN, sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate())

我有下面的SQL代码

SELECT s.[CusNo] Supp, 
    RTRIM(CAST(s.[Customer] AS VARCHAR(50))) AS Name,
    s.[ConNo] Con, 
    RTRIM(CAST(s.[ConN] AS VARCHAR(50))) AS ConN,       
    sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 
             then s.SELL else 0 end) ActualSales
FROM [dbo].[Reports] s
WHERE s.BOX = 2
AND   s.SELL <> 0
GROUP BY s.[CusNo], s.[Customer], s.ConNo, s.ConN
当我执行上述查询时,我将在ActualSales列中获得包括0个值在内的所有值

如何删除值为0的行?请使用having子句

也可以使用子查询

select * from
(
    SELECT s.[CusNo] Supp, 
    RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name,
     s.[ConNo] Con, 
    RTRIM(CAST(s.[ConN] AS VARCHAR(50)) ) AS ConN,
    sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 
           then s.SELL else 0 end) ActualSales

FROM [dbo].[Reports] s
WHERE s.BOX = 2 and s.SELL <> 0
GROUP BY s.[CusNo], s.[Customer], s.ConNo, s.ConN
)A where ActualSales<>0
使用having子句

也可以使用子查询

select * from
(
    SELECT s.[CusNo] Supp, 
    RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name,
     s.[ConNo] Con, 
    RTRIM(CAST(s.[ConN] AS VARCHAR(50)) ) AS ConN,
    sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 
           then s.SELL else 0 end) ActualSales

FROM [dbo].[Reports] s
WHERE s.BOX = 2 and s.SELL <> 0
GROUP BY s.[CusNo], s.[Customer], s.ConNo, s.ConN
)A where ActualSales<>0

我认为通过将case条件移动到where子句,您可能会得到您想要的:

如果销售额可能为负,则实际销售额可能仍然为0。在这种情况下,您需要HAVING子句:HAVING SUMSales 0


因为这种方法在聚合之前进行过滤,所以它还可能有助于提高性能。

我认为通过将case条件移动到where子句,您可能会得到想要的结果:

如果销售额可能为负,则实际销售额可能仍然为0。在这种情况下,您需要HAVING子句:HAVING SUMSales 0

因为这种方法在聚合之前进行过滤,所以也可能有助于提高性能

SELECT s.[CusNo] as Supp, 
       RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name,
       s.[ConNo] as Con, 
       RTRIM(CAST(s.[ConN] AS VARCHAR(50)) ) AS ConN,
       SUM(s.SELL) as ActualSales
FROM [dbo].[Reports] s
WHERE s.BOX = 2 AND s.SELL <> 0 AND
      s.Date BETWEEN convert(date, dateadd(wk, datediff(week, 0, getdate()) - 1, 0) - 1) and
                     convert(date,dateadd(wk, datediff(week, 0, getdate()) - 1, 0) + 5)
GROUP BY s.[CusNo], s.[Customer], s.ConNo, s.ConN;