Sql 如何根据外部引用或其他方式分组?
我正在传递两个日期,需要根据这两个日期的结果进行分组,但由于出现错误,无法进行分组 Msg 164,第15级,状态1,第24行每个分组的表达式必须 至少包含一个非外部引用的列 查询如下:Sql 如何根据外部引用或其他方式分组?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在传递两个日期,需要根据这两个日期的结果进行分组,但由于出现错误,无法进行分组 Msg 164,第15级,状态1,第24行每个分组的表达式必须 至少包含一个非外部引用的列 查询如下: 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, s
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
如前所述,您的查询正在尝试按常量表达式分组。我想你可以把最后两行改成:
and i.OverrideDate between @sd and @ed
groupby
语句是不必要的。您只返回一行,因此将聚合所有行
如果出于某种原因(例如这是自动生成的代码),您需要包含分组依据,则可以使用以下技巧:
group by (case when OverrideDate = OverrideDate then @sd end),
(case when OverrideDate = OverrideDate then @ed end)
但是我猜这在这种情况下是不必要的。我不知道为什么您使用groupby
和在这里有子句。我想你可以把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
没有理由这样做,请解释您期望的结果以及您对结果进行分组的逻辑。请参阅编辑。谢谢您确定这些结果来自同一查询吗?如何在前两列中为@sd,@ed
获得不同的结果?此查询针对从临时表检索到的每一行运行。该表包含sd行和ed列+1行,用于我不知道的case技巧:)(但这里看起来没用)我在使用case语句时仍然收到外部引用错误。@xerxes。事实上,我想你需要在里面有一个变量引用,现在我看看我实际使用它的代码。
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