0

在下面的代码中,产生的错误是“对象 t 不存在”。T 是 FROM 中定义的派生表。我不想在 SELECT 子查询中重新过滤,而是想使用派生表来节省处理时间。由于 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
4

2 回答 2

0

我们可以使用内联视图或公用表表达式来实现结果(看起来就像您想要的那样)。作为使用内联视图的示例:

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

我还想避免任何潜在的“除以零”错误,因此我将该 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'
于 2016-04-14T00:04:21.817 回答
0

如果你使用的是 SQL Server,你会这样做:

;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"

我认为可以对查询进行更多改进,但这是一个好的开始。

于 2016-04-13T22:52:03.303 回答