2015-06-10 3 views
0

Странная проблема с предложением GROUP BY и HAVING на 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) 

Это возвращает одну строку ... для 1/31/2015. Единственная дата в общем нулевой

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 - И нет никакой группировки по этому колонку, которая будет возвращать 0 для sum(datavalue): http://sqlfiddle.com/#!6/5e44cb/4 (это 89)

Если бы вы добавить свой ожидаемый результат к вашему пост, мы могли бы помочь вам с запросом, который вам нужен.

3

Удаляя GROUP BY asOfDate, вы удалили все группы, которые имеют SUM() = 0.

Вы должны сделать свой первый запрос производной таблицей или CTE, а затем сделать MAX за ее пределами, чтобы получить желаемые результаты.

+0

Прощайте победу, так как он показал мне, что было не так сперва ... вероятно, пойдет с подходом CTE. –

Смежные вопросы