1

2 つの日付を渡しているので、これら 2 つの日付で結果をグループ化する必要がありますが、エラーが発生するため実行できません

メッセージ 164、レベル 15、状態 1、行 24 各 GROUP BY 式には、外部参照ではない列が少なくとも 1 つ含まれている必要があります。

クエリは次のとおりです。

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
4

2 に答える 2

2

書かれているように、クエリは定数式でグループ化しようとしています。最後の2行を次のように変更できると思います:

and i.OverrideDate between @sd and @ed

group byステートメントは不要です。1 行のみを返すため、すべての行が集計されます。

group by何らかの理由で (これが自動的に生成されたコードであるなど)を含める必要がある場合は、次のようなトリックを使用できます。

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

しかし、この場合は不要だと思います。

于 2013-02-26T16:48:24.093 に答える
0

なぜここでgroup by and 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
于 2013-02-26T16:51:48.747 に答える