0

SQL Server 2008

結果セットで簡単な計算を行ういくつかのローカル変数を含むクエリがあります。クエリをコピーして貼り付けてビューとして保存しようとすると、構文が正しくないことがわかりません。(この場合、変数のdeclareステートメントの近くにあります。)必要に応じて、クエリを投稿します。これが一方の方法で機能し、もう一方の方法では機能しない理由があるかどうか疑問に思います。

declare @totalpop float,
@totalMales float,
@totalFemales float,
@percentMales float,
@percentFemales float;
select @totalmales=sum(case when sex='m' then 1 else 0 end),
@totalfemales = sum(case when sex='f' then 1 else 0 end),
@totalpop=count(*)

from tblVisits
select @percentmales = round(100 * @totalmales/@totalpop,2),
@percentFemales = round(100*@totalfemales/@totalpop,2)

select @totalmales,@percentmales,@totalfemales, @percentfemales, @totalpop
4

3 に答える 3

6

宣言された変数は必要ありません。ネストされたselectを使用して、昔ながらのSQLでこれを行うことができます。

SELECT totalmales, round(1e2*totalmales/totalpop, 2) percentmales,
       totalfemales, round(1e2*totalfemales/totalpop, 2) percentfemales,
       totalpop
FROM (SELECT sum(case when sex='m' then 1 else 0 end) totalmales,
             sum(case when sex='f' then 1 else 0 end) totalfemales,
             count(*) totalpop
      FROM tblVisits) innerquery

これは、ビューと副選択をサポートするほとんどすべてのデータベース(基本的にはすべて)で使用できるはずです。

于 2012-05-14T14:25:10.307 に答える
1

ビュー内で変数を使用することはできません。ただし、SP(ストアドプロシージャ)またはテーブルベースの関数で変換することはできます。

編集:またはTokenMacGuyがあなたに言ったことをしてください:P。

于 2012-05-14T14:26:10.527 に答える
0

SQL Server 2008を使用しているので、これを行う別の方法はPIVOTを使用することです。

  create view V as 
  select
    m as totalmales,
    round(1e2*m/(m+f),2) as pctmales,
    f as totalfemales,
    round(1e2*f/(m+f),2) as pctfemales,
    m+f as totalpop
  from tblVisits as T
  pivot (count(sex) for sex in ([m],[f])) as P;

これを行う場合は、必ず1e2を維持するか、round()式内で100ではなく100.0を使用してください。それ以外の場合、除算m /(m + f)とf /(m + f)は整数除算になり、両方ともゼロになります。

于 2012-05-14T14:47:06.460 に答える