如何在 SQL 中的计算字段上使用 order by?
How to use order by on a calculated field in SQL?
如何在 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
子句就可以正常工作。
最简单的方法是使用 select 列表中的列编号而不是其名称:ORDER BY 13
.
将 Aaron Bertrand 的评论作为社区 Wiki 发布,因为我认为这是最直接的答案:
a.total1
不存在,因为 SQL 服务器将在 SMarginText
中查找该列,但 ORDER BY TOTAL1;
可以正常工作。
您可以按照 Mureinik 的建议进行操作,并使用 ORDER BY 13
的序号表示法,意思是“按第 13 列排序”。但是,我倾向于避免它,因为如果您稍后回来,很难说出您 打算 点什么。此外,如果您需要添加列或更改顺序,则必须记住更新 ORDER BY 子句。很容易错过。
正如其他人在评论中提到的,可以使用您在 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 BY
在 SELECT
之后解决,不像 WHERE
或 FROM
在 SELECT
之前解决,因此不能引用 [=29 中的列别名=] 服务器.
如果您的列别名与 table 中的列同名,这可能会造成混淆或模棱两可,因此您需要注意这一点。
如何在 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
子句就可以正常工作。
最简单的方法是使用 select 列表中的列编号而不是其名称:ORDER BY 13
.
将 Aaron Bertrand 的评论作为社区 Wiki 发布,因为我认为这是最直接的答案:
a.total1
不存在,因为 SQL 服务器将在 SMarginText
中查找该列,但 ORDER BY TOTAL1;
可以正常工作。
您可以按照 Mureinik 的建议进行操作,并使用 ORDER BY 13
的序号表示法,意思是“按第 13 列排序”。但是,我倾向于避免它,因为如果您稍后回来,很难说出您 打算 点什么。此外,如果您需要添加列或更改顺序,则必须记住更新 ORDER BY 子句。很容易错过。
正如其他人在评论中提到的,可以使用您在 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 BY
在 SELECT
之后解决,不像 WHERE
或 FROM
在 SELECT
之前解决,因此不能引用 [=29 中的列别名=] 服务器.
如果您的列别名与 table 中的列同名,这可能会造成混淆或模棱两可,因此您需要注意这一点。