SQL 动态 ORDER BY 使用别名 [英] SQL dynamic ORDER BY using alias

查看:54
本文介绍了SQL 动态 ORDER BY 使用别名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 SQL Server,我可以使用别名对普通的 SELECT 查询进行排序:

Using SQL Server, I can order a normal SELECT query using an alias:

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 做同样的事情:

However, attempting to do the same thing with a dynamic 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

产生以下错误:

消息 207,级别 16,状态 1,第 10 行
列名PhysicianName"无效.
Msg 207, Level 16, State 1, Line 11无效的列名ReferralsCount".

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 中单独使用.不是在表达.

Column aliases defined in the SELECT can only be used in the ORDER BY on their own. Not in an expression.

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

You can adjust your original attempt as follows.

;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 使用别名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆