运行的查询无法保存为视图

时间:2012-05-14 14:17:22

标签: sql

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

3 个答案:

答案 0 :(得分: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

大多数支持视图和子选择的数据库(基本上都是这些数据库)都应该可用。

答案 1 :(得分:1)

您无法在视图中使用变量。但是,您可以在SP(存储过程)或基于表的函数中对其进行转换。

编辑:或者做TokenMacGuy告诉你的事情:P。

答案 2 :(得分: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.0而不是100。否则,除法m /(m + f)和f /(m + f)将为整数除法,两者均为零。