Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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中使用多个“With”子句_Sql_Oracle - Fatal编程技术网

在sql中使用多个“With”子句

在sql中使用多个“With”子句,sql,oracle,Sql,Oracle,我正在使用oracle database 10g,并试图计算数据集的控制上限和控制下限。虽然它对于电话号码值似乎没有用处,但我只是尝试将其用作一种学习体验。输出应具有以下条目的行形式:- 称呼、邮政编码、lcl和ucl值 这将有助于更好地理解数据 with q as( select student_id,salutation,zip,first_name,last_name from tempTable) with r as( select avg(phone) as average

我正在使用oracle database 10g,并试图计算数据集的控制上限和控制下限。虽然它对于电话号码值似乎没有用处,但我只是尝试将其用作一种学习体验。输出应具有以下条目的行形式:- 称呼、邮政编码、lcl和ucl值 这将有助于更好地理解数据

with q as(

 select student_id,salutation,zip,first_name,last_name from tempTable)

 with r as(

 select avg(phone) as average,stddev(phone) as sd from tempTable)

 select salutation,zip,average-3*sd as"lcl",average+3*sd as"UCL"

from
q ,r
给出的错误是缺少select语句。请告诉我是怎么回事,我是sql新手,在使用堆叠CTE时自己不能做这件事,除了第一个您不需要的CTE外,请在CTE名称前使用关键字逗号。试试这个语法

WITH q 
     AS (SELECT student_id, 
                salutation, 
                zip, 
                first_name, 
                last_name 
         FROM   temptable), 
     r 
     AS (SELECT Avg(phone)    AS average, 
                STDDEV(phone) AS sd 
         FROM   temptable) 
SELECT salutation, 
        zip, 
        average - 3 * sd AS"lcl", 
        average + 3 * sd AS"UCL" 
FROM   q Cross Join r; 
我认为运行这样的查询根本不需要WITH子句。最好使用AVG和STDEV函数作为Oracle行话中的窗口函数和分析函数:

SELECT temp1.*, average - 3 * sd AS lcl, average + 3 * sd AS ucl
  FROM (
    SELECT student_id, salutation, zip, first_name, last_name
         , AVG(phone) OVER ( ) AS average, STDDEV(phone) OVER ( ) AS sd
      FROM tempTable
) temp1
您甚至不需要子查询,但它有助于保存一些击键。请参阅,其中包含来自DUAL的虚拟数据


另外,如果要使用*获取子查询中选定的所有列,则需要子查询的别名temp1,否则将无法工作。或者,您可以显式命名列,这是一种很好的做法。

查询的语法是错误的:q为select student\u id,saltation,zip,first\u name,last\u name from tentable,r为select avgphone as average,stddevphone为sd from tentable select saltation,zip,average-3*sd aslcl,average+3*sd asUCL from q,r。然后q和r之间的链接丢失了。是的,它工作得很好,谢谢。有没有更好的方法可以达到同样的效果?@chinmay-如果你添加样本数据和预期输出,那么很容易找到更好的方法。我只是希望找到一种通用方法来计算表的ucl和lcl值,然后将其与表中的所有数据一起显示为列条目,就像我们刚才对该表所做的那样