0

SQL Server 2008

我有一个包含几个局部变量的查询,这些变量在结果集中进行了一些简单的数学运算。当我复制并粘贴查询以尝试将其保存为视图时,它无法告诉我语法不正确。(在这种情况下,它靠近变量的声明语句。)如果需要,我会发布查询,只是想知道是否有理由让它以一种方式而不是另一种方式工作。

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

您不需要任何声明的变量,您可以使用嵌套选择在普通旧 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;

如果这样做,请确保在 round() 表达式中保留 1e2 或使用 100.0 而不是 100。否则,除法 m/(m+f) 和 f/(m+f) 将是整数除法,并且都产生零。

于 2012-05-14T14:47:06.460 回答