Sql 如何根据外部引用或其他方式分组?

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

我正在传递两个日期,需要根据这两个日期的结果进行分组,但由于出现错误,无法进行分组

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,
        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