2

SQL Server 2008 R2を使用していますが、動的T-SQLクエリで問題が発生しました。私はそれが私の構文に関係していると信じていますが、動的なT-SQLコンテキストから取り出されると、新しいクエリウィンドウで正常に実行されます。ストアドプロシージャとして実行すると、次のエラーが発生することがあります。

集計関数にも句にも含まれていないため、選択リストの列dbo.Birds.weightは無効です。GROUP BY

T-SQLコード:

set @sql =
N'select FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval as ''Weight'',
COUNT(1) as ''Count''
FROM dbo.Birds
WHERE
weight >= @INPUTminwgt AND 
weight <= @INPUTmaxwgt
GROUP BY FLOOR(weight*@INPUTconversion) 
order by weight asc'


set @params =
N'@INPUTminwgt float, 
@INPUTmaxwgt float, 
@INPUTconversion float,
@INPUTinterval float';

exec sp_executesql @sql, @params,  
@INPUTminwgt = @BirdMinWeight, 
@INPUTmaxwgt = @BirdMaxWeight,
@INPUTconversion = @conversion,
@INPUTinterval = @interval;

重みは小数点以下1000桁になります(例:3.154)

@INPUTconversion = 1/interval

クエリは、間隔でグループ化された最小と最大の重みパラメータ間の重みを返す必要があります(たとえば、.1間隔は、その重みスパン内の鳥の総数で1.1、1.2、1.3、1.4のようになります)

どんな助けでも大歓迎です

4

2 に答える 2

2

group byで、*@INPUTintervalsが欠落しています。

そのはずGROUP BY FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval

また、とでエイリアスweightを使用することはできません。使用するか、ここで必要なエイリアスをあいまいにする必要があります。whereorder byFLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTintervaldbo.Birds.weight

set @sql =
N'select FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval as ''Weight'',
COUNT(1) as ''Count''
FROM dbo.Birds
WHERE
dbo.Birds.weight >= @INPUTminwgt AND 
dbo.Birds.weight <= @INPUTmaxwgt
GROUP BY FLOOR(weight*@INPUTconversion) *@INPUTinterval
order by FLOOR(weight*@INPUTconversion) *@INPUTinterval asc'
于 2012-10-01T17:02:39.987 に答える
0

私の推測では、dbo.Birds.Weightは、クエリの下部にある「重み」と同じものであるとは認識されていません。これは確かに興味深いことであり、なぜこれが起こっているのかはよくわかりませんが、おそらくうまくいくでしょう:

set @sql = N'
SELECT 
  FLOOR(b.weight * @INPUTconversion) * @INPUTinterval as [Weight],
  COUNT(*) as ''Count''
FROM  dbo.Birds b
WHERE b.weight >= @INPUTminwgt 
AND   b.weight <= @INPUTmaxwgt
GROUP BY FLOOR(b.weight * @INPUTconversion) * @INPUTinterval
ORDER BY FLOOR(b.weight * @INPUTconversion) * @INPUTinterval'
于 2012-10-01T17:07:34.940 に答える