已下达最大订单数的客户是否有 最高评分?
带有表格订单,客户和销售人员
我尝试使用CTE解决它,但它给了我错误。我写的代码是
;with cte1 as (
select count(onum) cnt,cnum
from sql_practice.practice.Orders o
group by cnum)
select * from cte1 where cnt=(
select max(cnt) from (select count(onum) cnt,cnum
from sql_practice.practice.Orders o
group by cnum)A)
;with cte2 as(select cnum from sql_practice.practice.Customer where rating in(select max(RATING) from
sql_practice.practice.Customer))
select * from cte2,cte1 where cte2.CNUM=cte1.cnum;
在上述查询中,cte1被标识为无效对象
答案 0 :(得分:0)
CTE的局限性是CTE的范围仅到CTE声明后的下一行为止。因此,此后您将无法使用CTE。
在您的情况下,这意味着当您根据MAX(cnt)检查cnt时,CTE1在行中终止了它的作用域,因此无法进一步引用。
有2个解决方案。
第一个是使用Temp表或Table变量而不是CTE。
但正在查看您的要求。我认为以下方法可以更好地解决您的问题
;WITH CTE
AS
(
SELECT
C.cnum,
MaxOnum = MAX(O.Onum) OVER(PARTITION BY NULL),
MaxRating = MAX(C.Rating) OVER(PARTITION BY NULL)
FROM sql_practice.practice.Orders O
INNER JOIN sql_practice.practice.Customer C
ON C.CNUM = O.Cnum
)
SELECT
*
WHERE MaxOnum = MaxRating
答案 1 :(得分:0)
创建一个cte只能立即使用。然后,您无法在执行额外的选择查询并创建cte2之后使用cte1
如果要使用两个ctes进行选择查询,则需要此查询
;with cte1 as (
select count(onum) cnt,cnum
from sql_practice.practice.Orders o
group by cnum)
,cte2 as
(select cnum from sql_practice.practice.Customer where rating in(select max(RATING)
from sql_practice.practice.Customer))
select * from cte2
inner join cte1 on cte2.CNUM=cte1.cnum;