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小提琴:
答案 0 :(得分:4)
简单地说,因为您按d.categoryid
进行分组 - 此列没有分组,这将为0
返回sum(datavalue)
:
http://sqlfiddle.com/#!6/5e44cb/4(现在是89)
如果您可以将预期输出添加到帖子中,我们可能会帮助您完成所需的查询。
答案 1 :(得分:3)
通过删除GROUP BY asOfDate,您已删除任何具有SUM()= 0的组。
您应该首先查询派生表或CTE,然后在其外部执行MAX以获得所需结果。