2013-02-26 4 views
1

Я передаю в две даты и нужно сгруппировать по результатам этими двумя датами, но не может сделать это, как я получаю ошибкуКак сгруппировать по внешним ссылкам или любым другим способом?

Msg 164, Level 15, State 1, Line 24 Каждая GROUP BY выражения должен содержать , содержащий по крайней мере один столбец, который не является внешней ссылкой.

запрос выглядит следующим образом:

declare @sd datetime ='2012-07-01 00:00:00.000' , 
     @ed datetime ='2012-09-30 00:00:00.000' ; 

select @sd,@ed, 
     count(i.id)as count, 
     sum(case when oi.rating <50 then 1 else 0 end) as unfav, 
     sum(case when oi.Rating =50 then 1 else 0 end) as neu, 
     sum(case when oi.Rating >50 then 1 else 0 end) as fav, 
     avg(oi.Rating)as 'Av Rating' 
     from Items i (nolock) 
     inner join ItemOrganisations oi (nolock) on i.ID= oi.ItemID 
     inner join Lookup_ItemTypes it (nolock) on it.ID = i.ItemTypeID 

     inner join Batches b (nolock) on b.ID=i.BatchID 
     inner join Lookup_ItemStatus lis (nolock) on lis.ID = i.StatusID 
     inner join Lookup_BatchStatus lbs (nolock) on lbs.ID = b.StatusID 
     inner join Lookup_BatchTypes bt on bt.id = b.Typeid 

     where lbs.Name = 'Completed by Analyst' or lbs.Name='Delivered/Imported into Neptune Online' 
     and lis.Name = 'Complete' 
     and i.IsRelevant = 1 
     and bt.Name = 'Live' 
     group by @sd,@ed 
     having i.OverrideDate between @sd and @ed 

Если я не группируют по это результат я получаю, что неправильно:

2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 1 0 0 1 55 
2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 7 1 0 1 50 
2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 7 1 0 0 20 
2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 1 0 0 0 NULL 
2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 8 1 0 6 66 
2011-01-01 00:00:00.000 2011-01-31 00:00:00.000 1 1 0 0 10 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 1 0 0 1 55 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 7 1 0 1 50 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 7 1 0 0 20 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 1 0 0 0 NULL 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 8 1 0 6 66 
2011-02-01 00:00:00.000 2011-02-28 00:00:00.000 1 1 0 0 10 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 1 0 0 1 55 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 7 1 0 1 50 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 7 1 0 0 20 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 1 0 0 0 NULL 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 8 1 0 6 66 
2011-03-01 00:00:00.000 2011-03-31 00:00:00.000 1 1 0 0 10 
2011-04-01 00:00:00.000 2011-04-30 00:00:00.000 1 0 0 1 55 
2011-04-01 00:00:00.000 2011-04-30 00:00:00.000 7 1 0 1 50 
2011-04-01 00:00:00.000 2011-04-30 00:00:00.000 7 1 0 0 20 
+1

Там нет никаких оснований для этого, пожалуйста, объясните, какой результат вы ожидаете, и что ваша логика для группировки результатов – jazzytomato

+0

см edit.thanks – Xerxes

+0

Вы уверены, что эти результаты одного запроса? как вы получаете разные результаты для '@ sd, @ ed' в первых двух столбцах? – Kaf

ответ

2

Ваш запрос, как написано, пытается группировать по постоянному выражению. Я думаю, вы можете просто изменить последние две строки:

and i.OverrideDate between @sd and @ed 

group by заявление не требуется. Вы возвращаете только одну строку, поэтому все строки будут агрегированы.

Если вам необходимо включить group by по какой-то причине (например, это время автоматически генерируется код), то вы можете использовать трюк, такие как:

group by (case when OverrideDate = OverrideDate then @sd end), 
     (case when OverrideDate = OverrideDate then @ed end) 

Но я предполагаю, что это unncessary в этом дело.

+0

+1 для * случая, когда * трюк, который я не знал :) (но он выглядит бесполезным здесь) – jazzytomato

+0

Я все еще получаю внешнюю опорную ошибку при использовании оператора case. – Xerxes

+0

@xerxes. , , На самом деле, я думаю, вам нужно иметь переменную ссылку, теперь, когда я смотрю на код, где я его фактически использую. –

0

Я не уверен, почему вы используете group byиhaving пункты здесь вообще отсутствуют. Я думаю, вы могли бы упростить свое предложение where;

where lbs.Name in ('Completed by Analyst', 
        'Delivered/Imported into Neptune Online') 
     and lis.Name = 'Complete' 
     and bt.Name = 'Live' 
     and i.IsRelevant = 1 
     and i.OverrideDate between @sd and @ed 
Смежные вопросы