Обратитесь к производной таблице в подзапросе 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"
Я думаю, что в запрос можно внести гораздо больше улучшений, но это хорошее начало.