Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法将运行的查询另存为视图_Sql - Fatal编程技术网

Sql 无法将运行的查询另存为视图

Sql 无法将运行的查询另存为视图,sql,Sql,SQL Server 2008 我有一个带有几个局部变量的查询,它在结果集中做了一些简单的数学运算。当我复制并粘贴查询以尝试将其保存为视图时,它无法告诉我存在不正确的语法。(在本例中,它靠近变量的declare语句。)如果需要,我将发布查询,只是想知道这是否是一种工作方式而不是另一种方式的原因 declare @totalpop float, @totalMales float, @totalFemales float, @percentMales float, @percentFemales

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

您不需要任何已声明的变量,可以在带有嵌套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

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

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


编辑:或者按照MacGuy告诉您的操作:p.

您正在使用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)将是整数除法,两者都为零。

请提供有关您的问题的更多信息。您可以复制粘贴您正在使用的查询吗?另外:这是用于哪个DBMS?在快速搜索时,我发现了以下帖子:。一位回答者说您不能在视图中使用变量,但建议查看表值函数。另一个搜索是n MSDN提出了以下问题:为了澄清……在视图的定义中不能使用局部变量。也许您需要的是一个返回行的存储过程。尽管有很多UPVOUT,但此答案的原始版本将为两个百分比生成0(如果每个人都是同性,则为0和1),因为它在外部查询中进行整数除法。我正在更正它以使其正常工作。