在 SELECT 子查询中引用派生 Table
Refer to a Derived Table in a SELECT Subquery
在下面的代码中,产生的错误是“对象 t 不存在”。 T 是 FROM 中定义的派生 table。我不想在 SELECT 子查询中重新过滤,而是想使用派生的 table 来节省处理时间。由于FROM是按操作顺序先处理的,所以我觉得应该有办法让我在SELECT.
中引用"t"
(我在 Teradata 以防万一)
SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
FROM t
WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"
FROM (SELECT sprice, quantity, sku, store, saledate
FROM trnsact
WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
) as t
如果您使用的是 SQL 服务器,您会这样做:
;WITH t as
SELECT sprice, quantity, sku, store, saledate
FROM trnsact
WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
FROM t
WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"
我认为可以对查询进行更多改进,但这是一个好的开始。
我们可以使用内联视图或常见的 table 表达式来实现结果(看起来就像您想要的那样)。作为使用内联视图的示例:
SELECT ( 100000
/ COUNT(DISTINCT
CASE WHEN EXTRACT(MONTH FROM t.saledate) = 11
THEN EXTRACT(DAY FROM t.saledate)
ELSE NULL
END
)
) AS "NOVEMBER"
FROM ( SELECT r.sprice
, r.quantity
, r.sku
, r.store
, r.saledate
FROM trnsact r
WHERE r.saledate BETWEEN '2004-11-01' AND '2004-12-31'
) t
我还想避免任何潜在的 "divide by zero" 错误,所以我将 COUNT() 表达式包装在 NULLIFZERO 函数中。
我们会注意到,对于该结果集,我们实际上不需要内联视图或 CTE。它可以通过更简单的查询来实现:
SELECT ( 100000
/ NULLIFZERO(COUNT(DISTINCT EXTRACT(DAY FROM t.saledate)))
) AS "NOVEMBER"
FROM trnsact t
WHERE t.saledate >= '2004-11-01'
AND t.saledate < '2004-12-01'
在下面的代码中,产生的错误是“对象 t 不存在”。 T 是 FROM 中定义的派生 table。我不想在 SELECT 子查询中重新过滤,而是想使用派生的 table 来节省处理时间。由于FROM是按操作顺序先处理的,所以我觉得应该有办法让我在SELECT.
中引用"t"(我在 Teradata 以防万一)
SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
FROM t
WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"
FROM (SELECT sprice, quantity, sku, store, saledate
FROM trnsact
WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
) as t
如果您使用的是 SQL 服务器,您会这样做:
;WITH t as
SELECT sprice, quantity, sku, store, saledate
FROM trnsact
WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
FROM t
WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"
我认为可以对查询进行更多改进,但这是一个好的开始。
我们可以使用内联视图或常见的 table 表达式来实现结果(看起来就像您想要的那样)。作为使用内联视图的示例:
SELECT ( 100000
/ COUNT(DISTINCT
CASE WHEN EXTRACT(MONTH FROM t.saledate) = 11
THEN EXTRACT(DAY FROM t.saledate)
ELSE NULL
END
)
) AS "NOVEMBER"
FROM ( SELECT r.sprice
, r.quantity
, r.sku
, r.store
, r.saledate
FROM trnsact r
WHERE r.saledate BETWEEN '2004-11-01' AND '2004-12-31'
) t
我还想避免任何潜在的 "divide by zero" 错误,所以我将 COUNT() 表达式包装在 NULLIFZERO 函数中。
我们会注意到,对于该结果集,我们实际上不需要内联视图或 CTE。它可以通过更简单的查询来实现:
SELECT ( 100000
/ NULLIFZERO(COUNT(DISTINCT EXTRACT(DAY FROM t.saledate)))
) AS "NOVEMBER"
FROM trnsact t
WHERE t.saledate >= '2004-11-01'
AND t.saledate < '2004-12-01'