如何获得计数没有结果或结果为0,然后计数为0,否则在SQL Server中为1

时间:2018-10-18 15:45:05

标签: sql-server-2008 sql-server-2012

我在处理SQL Server查询时遇到问题。我想计算2018-10-18和2018-10-28之间具有非0值的记录数。如果该日期范围内的记录的值为0,则计数应为0。这是一条不应计数的记录:

CREATE TABLE [dbo].[sno](
    [Flag] [int] NULL
) 
GO
INSERT [dbo].[sno] ([Flag]) VALUES (0)
GO

我尝试了以下查询:

SELECT  count(case when value=0  or  isnull(value,0)=0 then 0  else 1 end )Flag
  FROM [ab].[dbo].[sno]
  where getdate() between '2018-10-18' and '2018-10-28'

运行此查询时,得到以下结果: 如果Flag值为0,那么我得到

Flag
0

如果没有记录,我会得到

Flag
0

如果Flag的值为1,我得到

Flag 
1

预期结果:

如果没有记录或值为0,那么我应该得到

Flag
0

否则我应该得到

Flag 
1

2 个答案:

答案 0 :(得分:0)

您可以通过两种方式做到这一点。

第一种方法使用COUNT()COUNT()将考虑其聚合中的任何非NULL值,因此我们需要更改THEN语句的CASE,如下所示:

SELECT 
Flag = COUNT(CASE 
                WHEN value = 0 OR ISNULL(value, 0) = 0
                    THEN NULL
                ELSE 1
             END )
FROM ab.dbo.sno
WHERE
    GETDATE() BETWEEN '2018-10-18' AND '2018-10-28'

但是等等! 您还可以使用SUM()和原始语法来完成相同的操作,如下所示:

SELECT 
Flag = SUM(CASE WHEN value = 0 OR ISNULL(value, 0) = 0
            THEN 0
            ELSE 1
         END)
FROM ab.dbo.sno
WHERE
    GETDATE() BETWEEN '2018-10-18' AND '2018-10-28'

答案 1 :(得分:0)

尝试一下

https://rextester.com/UGL6377

SELECT case when zeros>0 then 0 else total end from (
SELECT  sum(case when flag=0 then 1  else 0 end ) zeros, count(flag) total
  FROM  [sno]
  where getdate() between '2018-10-18' and '2018-10-28') q