俱乐部多次"用" sql中的子句

时间:2015-01-18 11:10:15

标签: sql oracle

我正在使用oracle数据库10g并尝试计算数据集的上限控制和控制下限。虽然它似乎对电话号码值无用但我只是想用它作为学习经验。输出应该有一个明智的表格形式: - 称呼,zip,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

给出的错误是选择语句缺失。请告诉我有什么问题我是一个sql新手并且不能自己做

2 个答案:

答案 0 :(得分:2)

使用stacked CTE预期第一个CTE时,您不需要With个关键字,而是在comma名称之前使用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; 

答案 1 :(得分:1)

我认为你根本不需要WITH子句来运行这样的查询。将AVG()STDDEV()函数用作窗口函数(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中的虚拟数据this SQL Fiddle demo

P.S。如果要使用temp1来获取子查询中选择的所有列,则确实需要别名(在本例中为*)用于子查询 - 否则将无效。或者,您可以明确命名列,这无论如何都是一种很好的做法。