【问题标题】:How to use order by on a calculated field in SQL?如何在 SQL 中的计算字段上使用 order by?
【发布时间】:2016-12-09 13:03:32
【问题描述】:

如何在 SQL 中的计算字段上使用 order by?

select a.Customer
    ,a.PlanTo
    ,a.Dollar01
    ,a.Dollar02
    ,a.Dollar03
    ,a.Dollar04
    ,a.Dollar05
    ,a.Dollar06
    ,a.Dollar07
    ,a.Dollar08
    ,a.Dollar09
    ,a.Dollar10
    ,a.Dollar11
    ,a.Dollar12
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1
from MDM_STAT.sds.SMarginText a
where a.salesyear = '2016'
order by a.total1

这给了我 'Total1' 列不存在,但正如你所见,我已经创建了它,并且如果我不使用 order by 子句,它正在工作。

【问题讨论】:

  • 删除别名a. -- 试试order by total1...
  • a.total1 不存在,因为 SQL Server 将在 SMarginText 中查找该列,但 ORDER BY TOTAL1; 可以正常工作。
  • (1) 格式化您的代码和 (2) 明确(标记)您实际使用的 DBMS - 是 PostgreSQL 还是 SQL Server?
  • @AaronBertrand 谢谢.. 现在可以使用了。还删除了 postgresql 标签

标签: sql sql-server-2008 tsql select sql-order-by


【解决方案1】:

最简单的方法是在选择列表中使用列的编号而不是其名称:ORDER BY 13

【讨论】:

【解决方案2】:

将 Aaron Bertrand 的评论发布为社区 wiki,因为我认为这是最直接的答案:

a.total1 不存在,因为 SQL Server 将在 SMarginText 中查找该列,但 ORDER BY TOTAL1; 可以正常工作。

【讨论】:

    【解决方案3】:

    您可以按照 Mureinik 的建议进行操作,并使用 ORDER BY 13 的序数符号,意思是“按第 13 列排序”。但是,我倾向于避免它,因为如果您稍后回来,很难说出您打算订购什么。此外,如果您需要添加列或更改顺序,您必须记住更新 ORDER BY 子句。很容易错过。

    正如其他人在 cmets 中提到的,可以使用您在 ORDER BY 中指定的别名。但是,因为它是一个列别名,所以没有什么可以完全限定。 a.TOTAL1 没有任何意义。你必须ORDER BY TOTAL1:

    select a.Customer
        ,a.PlanTo
        ,a.Dollar01
        ,a.Dollar02
        ,a.Dollar03
        ,a.Dollar04
        ,a.Dollar05
        ,a.Dollar06
        ,a.Dollar07
        ,a.Dollar08
        ,a.Dollar09
        ,a.Dollar10
        ,a.Dollar11
        ,a.Dollar12
        ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
        + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
        + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
        + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
        + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
        + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1
    from MDM_STAT.sds.SMarginText a
    where a.salesyear = '2016'
    order by total1
    

    由于查询解决顺序,这有效。 ORDER BYSELECT 之后解决,与WHEREFROM 不同,它们在SELECT 之前解决,因此不能引用 SQL Server 中的列别名。

    如果您的列别名与表中的列同名,这可能会造成混淆或模棱两可,因此您需要注意这一点。

    【讨论】:

    • 感谢您的解释。这对于理解子句的工作方式非常有帮助。欣赏它。
    • @RahulBanerjee 知道订单查询被执行是很有帮助的。 Here 对此有更详细的说明,如果您有兴趣的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多