我在处理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
答案 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)
尝试一下
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