SQL 动态 ORDER BY 使用别名

标签 sql sql-server

使用 SQL Server,我可以使用别名来订购普通的 SELECT 查询:

SELECT   
   u.FirstName + ' ' + u.LastName as PhysicianName, COUNT(r.Id) as ReferralsCount
FROM     
   Referrals r 
INNER JOIN
   Users u ON r.PhysicianId = u.Id
GROUP BY 
   r.PhysicianId, u.FirstName, u.LastName
ORDER BY 
   PhysicianName

但是,尝试使用动态 ORDER BY 做同样的事情:

SELECT   
   u.FirstName + ' ' + u.LastName as PhysicianName, COUNT(r.Id) as ReferralsCount
FROM     
   Referrals r 
INNER JOIN
   Users u ON r.PhysicianId = u.Id
GROUP 
   BY r.PhysicianId, u.FirstName, u.LastName
ORDER BY 
    CASE WHEN @orderby = 'PhysicianName' THEN PhysicianName END,
    CASE WHEN @orderby = 'ReferralsCount' THEN ReferralsCount END

产生以下错误:

Msg 207, Level 16, State 1, Line 10
Invalid column name 'PhysicianName'.
Msg 207, Level 16, State 1, Line 11 Invalid column name 'ReferralsCount'.

最佳答案

SELECT 中定义的列别名只能在ORDER BY 中单独使用。不是在表达。

您可以按如下方式调整您的原始尝试。

;WITH T
     AS (SELECT u.FirstName + ' ' + u.LastName AS PhysicianName,
                COUNT(r.Id)                    AS ReferralsCount
         FROM   Referrals r
                INNER JOIN Users u
                  ON r.PhysicianId = u.Id
         GROUP  BY r.PhysicianId,
                   u.FirstName,
                   u.LastName)
SELECT *
FROM   T
ORDER  BY CASE
            WHEN @orderby = 'PhysicianName' THEN PhysicianName
          END,
          CASE
            WHEN @orderby = 'ReferralsCount' THEN ReferralsCount
          END 

关于SQL 动态 ORDER BY 使用别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105354/

相关文章:

sql-server - 存储过程 ENCRYPTION 选项取决于构建模式

SQL 服务器。聚合函数中使用子查询计算公式

sql - 正则表达式作为 SQL 模式的一部分

sql-server - 如何强制迁移创建 datetime2 字段而不是 datetime

sql - 索引减少读取的行数;无性能增益

SQL Server IF NOT EXISTS 用法?

php - 检索查询的最后两个字符串

java - 以下sql代码无法插入数据是什么原因?

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql-server - 我们可以在 WAN 上访问 Microsoft SQL Server 数据库吗?