Обратитесь к производной таблице в подзапросе SELECT.

В приведенном ниже коде полученная ошибка: "объект t не существует". T является производной таблицей, определенной в FROM. Вместо повторной фильтрации в подзапросе SELECT я хотел бы использовать производную таблицу, чтобы сэкономить на обработке. Поскольку FROM сначала обрабатывается в порядке операций, я чувствую, что для меня должен быть способ сослаться на "t" в SELECT.

(Я нахожусь в 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

2 ответа

Решение

Мы можем достичь результата (кажется, что вы добились этого) с помощью встроенного представления или общего табличного выражения. В качестве примера использования встроенного представления:

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'

Если вы используете 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"

Я думаю, что в запрос можно внести гораздо больше улучшений, но это хорошее начало.

Другие вопросы по тегам