2015-06-10 88 views
0

SQL Server 2014上的GROUP BY和HAVING子句存在一個奇怪的問題。帶有HAVING子句的GROUP BY不會返回一行嗎?

這顯然有可能我做了錯誤的事情,但我無法理解這一點。

這裏的設置數據:

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

回答

4

簡單,因爲你是d.categoryid分組 - 而且沒有分組通過此列,這將返回0sum(datavalue)http://sqlfiddle.com/#!6/5e44cb/4(這是89)

如果你可以在你的預期產出添加到您的發佈後,我們可能能夠幫助您完成所需的查詢。

3

由asOfDate刪除該組,您已刪除具有SUM()=任何團體0。

您應該將您的第一個查詢作爲派生表或CTE,然後在其外部執行MAX以獲得您想要的結果。

+0

自從他向我展示什麼是第一個錯誤以後,讓dognose贏得了勝利......可能會採用CTE方法。 –