在 sql 中合并多个 "With" 子句
clubbing multiple "With" clauses in sql
我正在使用 oracle 数据库 10g 并尝试计算数据的控制上限和控制下限 set.Though 它似乎对 phone 数值没有用,但我只是想使用它作为学习 experience.The 输出应该有一个行形式的条目:-
称呼、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
给出的错误是 select 语句缺失。请告诉我哪里出了问题我是 sql 新手,我自己做不到
在使用 stacked CTE
时预计第一个 CTE
您不需要 With
关键字,而是在 CTE
名称之前使用 comma
。试试这个语法。
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()
和 STDDEV()
函数用作 window 函数(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
)——否则它将无法工作。或者,您可以明确命名列,无论如何这是一个好习惯。
我正在使用 oracle 数据库 10g 并尝试计算数据的控制上限和控制下限 set.Though 它似乎对 phone 数值没有用,但我只是想使用它作为学习 experience.The 输出应该有一个行形式的条目:- 称呼、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
给出的错误是 select 语句缺失。请告诉我哪里出了问题我是 sql 新手,我自己做不到
在使用 stacked CTE
时预计第一个 CTE
您不需要 With
关键字,而是在 CTE
名称之前使用 comma
。试试这个语法。
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()
和 STDDEV()
函数用作 window 函数(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
)——否则它将无法工作。或者,您可以明确命名列,无论如何这是一个好习惯。