Выберите результат подзапроса в CTE

Я использую CTE, в котором есть подзапрос. Затем я пытаюсь выбрать результат подзапроса в CTE, но получаю ошибку Invalid Column Name.

Запрос:

DECLARE @User AS VARCHAR(50)
SET @User = 'test.user'

WITH cte AS (
SELECT 
    o.db_OrderNo,
    o.db_Deferral
FROM
    tblOrders o
    LEFT JOIN tblUserProfile up on up.db_UserId = o.db_RTS
WHERE
    o.db_Deleted = 0
    AND (select OrderBucketId from Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) as Task) IN (1, 2, 3, 4)
    AND up.db_Email LIKE @User + '%'
)
SELECT COUNT(DISTINCT (CASE WHEN Task = 1 AND db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderInEvalCount,
   COUNT(DISTINCT (CASE WHEN Task = 2 AND db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderInDfcCount,
   COUNT(DISTINCT (CASE WHEN Task IN (3, 4) AND (select OrderStepId from Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo)) NOT IN (37, 39) AND
                             db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderWipCount,
   COUNT(DISTINCT (CASE WHEN db_Deferral <> 0 THEN db_OrderNo
                   END)) as OrderInPendedCount
FROM cte;

Он не распознает Task как столбец. На самом деле не привык делать подзапросы, поэтому этот формат может быть неправильным. Не уверен, что временная таблица может помочь здесь. Любая помощь будет оценена по достоинству.


person cfly24    schedule 22.10.2015    source источник
comment
Единственные вещи, которые считаются столбцами в вашем CTE, — это вещи в его первичном операторе выбора; Итак, db_OrderNo и db_Deferral. Если вы хотите что-то делать с Task за пределами CTE, вам придется включить его в эти столбцы.   -  person Hellion    schedule 22.10.2015
comment
Эта часть подзапроса кажется бессмысленной!... И (выберите OrderBucketId из Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) в качестве Task) IN (1, 2, 3, 4)   -  person russ    schedule 22.10.2015
comment
Я бы предложил удалить это предложение AND, а затем попытаться выполнить запрос, а затем выяснить, что эта часть должна делать,   -  person russ    schedule 22.10.2015


Ответы (1)


Ваш подзапрос находится в предложении WHERE. Столбцы берутся только из предложения FROM. Вы можете справиться с этим несколькими способами. Если вы знаете, что подзапрос не возвращает дубликатов, переместите логику в предложение FROM, используя CROSS APPLY:

WITH cte AS (
      SELECT o.db_OrderNo, o.db_Deferral
      FROM tblOrders o LEFT JOIN
           tblUserProfile
           up on up.db_UserId = o.db_RTS CROSS APPLY
           Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) t
      WHERE o.db_Deleted = 0 AND
            t.OrderBucketId  IN (1, 2, 3, 4) AND
            up.db_Email LIKE @User + '%'
     )
person Gordon Linoff    schedule 22.10.2015