GROUP BY with HAVING子句不会返回一行?

时间:2015-06-10 19:28:21

标签: sql sql-server sql-server-2014

SQL Server 2014上的GROUP BY和HAVING子句存在奇怪的问题。

我明显可能做错了什么,但我无法理解这一点。

以下是设置数据:

create table #accounts(accountid int)
create table #data(accountid int, categoryid int, asofdate date, datavalue numeric(20, 10))

insert into #accounts
    values 
    (1),(2),(3)

insert into #data
    values 
    (1, 10, '1/31/2015', 0),
    (1, 10, '2/28/2015', 10),
    (1, 10, '3/31/2015', 20),
    (2, 10, '1/31/2015', 0),
    (2, 10, '2/28/2015', 15),
    (2, 10, '3/31/2015', 25),
    (3, 10, '1/31/2015', 0),
    (3, 10, '2/28/2015', 7),
    (3, 10, '3/31/2015', 12)

这将返回单行... 2015年1月31日。总计为零的唯一日期

select categoryid, asofdate, sum(datavalue) as totalvalue
from #accounts a
inner join #data d
    on d.accountid = a.accountid
group by d.categoryid, d.asofdate
having sum(datavalue) = 0

结果为10, '1/31/2015', 0

然而,不知怎的,以下内容并没有返回任何行...我基本上要求它从第一个查询中给我最大日期。为什么这样做不好?

select categoryid, max(asofdate) as MaxAsOfDate, sum(datavalue) as totalvalue
from #accounts a
inner join #data d
    on d.accountid = a.accountid
group by d.categoryid
having sum(datavalue) = 0

drop table #accounts
drop table #data

但它没有返回任何行......困惑。

SQL小提琴:

http://sqlfiddle.com/#!6/5e44cb/1

2 个答案:

答案 0 :(得分:4)

简单地说,因为您按d.categoryid进行分组 - 此列没有分组,这将为0返回sum(datavalue)http://sqlfiddle.com/#!6/5e44cb/4(现在是89)

如果您可以将预期输出添加到帖子中,我们可能会帮助您完成所需的查询。

答案 1 :(得分:3)

通过删除GROUP BY asOfDate,您已删除任何具有SUM()= 0的组。

您应该首先查询派生表或CTE,然后在其外部执行MAX以获得所需结果。