【问题标题】:Invalid column name with RANK OVER function SQLRANK OVER 函数 SQL 的列名无效
【发布时间】:2023-04-04 06:26:01
【问题描述】:

尝试创建一个包含按产品销售的总数量的表格,并选择按日期细分的销量第三高的产品。不断报错

列名无效

我的RANK () OVER 语句的别名:

select 
    RANK () OVER (PARTITION BY t3.orderdate order by t3.total_amt_ordered) as ranking,
    t3.productid, 
    t3.orderdate,
    t3.total_amt_ordered
from 
    (select 
         t2.productid,
         t1.orderdate,
         SUM(t2.orderqty) as total_amt_ordered 
     from
         saleslt.salesorderheader t1 
     inner join 
         saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
     group by 
         productid, orderdate) t3
where 
    ranking = 3; 

【问题讨论】:

  • 你的期望是什么?

标签: sql sql-server rank adventureworks


【解决方案1】:

以下查询将返回按订单日期级别划分的所有产品 id 以及排名第三的所有订单数量。

SELECT * FROM
     (
        select 
                DENSE_RANK () OVER (PARTITION BY t3.orderdate order by  
                t3.total_amt_ordered DESC ) as ranking,
                t3.productid, 
                t3.orderdate,
                t3.total_amt_ordered
          from ( 
                 select 
                         t2.productid,
                         t1.orderdate,
                         SUM(t2.orderqty) as total_amt_ordered 
                   from
                         saleslt.salesorderheader t1 
                     inner join
                         saleslt.salesorderdetail t2 
                     on t1.salesorderid=t2.salesorderid 
                   group by productid, orderdate) t3
      ) Z
where Z.ranking= 3; 

【讨论】:

  • 谢谢!现在在 where 语句上出现错误。我可以不包括它吗?
  • 您遇到什么错误?而且我的查询在没有 where 子句的情况下也能工作吗?如果是这样,您看到的输出中的最后一列是什么...?
  • 没有 where 子句是行不通的。显示:消息 102,级别 15,状态 1,第 48 行 ';' 附近的语法错误。
  • 您可以尝试运行最内部的查询,看看结果如何...
  • 您需要为派生表添加别名,即在最终的 WHERE 之前
【解决方案2】:

WHERE是在RANK之前求值的,所以没有Derived Table/CTE是不能直接使用的,但是也是在SUM之后计算的,所以产生了这个查询:

select *
from 
  (  select 
         t2.productid,
         t1.orderdate,
         SUM(t2.orderqty) as total_amt_ordered,
         RANK ()
         OVER (PARTITION BY t1.orderdate
               order by SUM(t2.orderqty)) as ranking
     from
         saleslt.salesorderheader t1 
     inner join 
         saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
     group by 
         productid, orderdate
  ) t3
where 
    ranking = 3; 

【讨论】:

  • 这给了我空值。
  • @CameronWarren:空值?您可能需要切换到DENSE_RANK(或者可能需要切换到ROW_NUMBER
【解决方案3】:

这种方式可以使用,不能在where条件中使用排名查询和相同

;WITH cte
AS (SELECT
    RANK() OVER (PARTITION BY t3.orderdate ORDER BY t3.total_amt_ordered) AS ranking,
    t3.productid,
    t3.orderdate,
    t3.total_amt_ordered
FROM (SELECT
    t2.productid,
    t1.orderdate,
    SUM(t2.orderqty) AS total_amt_ordered
FROM saleslt.salesorderheader t1
INNER JOIN saleslt.salesorderdetail t2
    ON t1.salesorderid = t2.salesorderid
GROUP BY    productid,
            orderdate) t3)
SELECT
    *
FROM cte
WHERE ranking = 3;

【讨论】:

  • 这给出了所有的空值。
猜你喜欢
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2016-05-14
  • 2011-06-12
  • 2012-12-07
  • 2019-11-16
相关资源
最近更新 更多