Sql 在CTE中选择子查询的结果

Sql 在CTE中选择子查询的结果,sql,sql-server,sql-server-2008,subquery,common-table-expression,Sql,Sql Server,Sql Server 2008,Subquery,Common Table Expression,我正在使用一个包含子查询的CTE。然后,我试图从CTE中的子查询结果中进行选择,但得到的列名错误无效 查询: 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 WHE

我正在使用一个包含子查询的CTE。然后,我试图从CTE中的子查询结果中进行选择,但得到的列名错误无效

查询:

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;
它没有将任务识别为列。不太习惯做子查询,所以格式可能会出错。不确定临时表是否有帮助。任何帮助都将不胜感激。

您的子查询位于WHERE子句中。列仅来自from子句。你可以用几种方法来处理这个问题。如果知道子查询不返回重复项,则使用交叉应用将逻辑移到FROM子句:


在CTE中唯一算作列的是它的主select语句中的内容;所以,db_OrderNo和db_delay。如果你想处理CTE之外的任务,你必须把它包括在这些列中!。。。并从Main.udfGetOrderStatusStepInfoByOrderNoo.db_OrderNo中选择OrderBucketId作为1、2、3、4I中的任务,我建议删除该AND子句,然后尝试运行查询,然后确定该部分应该做什么,
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 + '%'
     )