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
答案 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)将为整数除法,两者均为零。