sql - 使用选定值计算新值
问题描述
select campaign
,ISNULL(sum(cast (HandleTime as bigint)), 0) handleTime
,(select Contacts from [View_ContactsByCampaign] Con where Con.Campaign = C.Campaign) Contacts
, ContactPerTime = Contacts / handleTime
from call C
group by campaign
我在计算 ContactPerTime 值时遇到问题。我收到“无效的列名‘联系人’”。和“无效的列名'handleTime'”错误。是否可以使用这些值进行计算?
解决方案
您不能通过SELECT
别名引用语句中的另一列。如果您再次需要该表达式,则需要重复该表达式:
SELECT campaign,
ISNULL(SUM(CAST (HandleTime AS bigint)), 0) AS handleTime,
(SELECT Contacts
FROM [View_ContactsByCampaign] Con
WHERE Con.Campaign = C.Campaign) AS Contacts,
(SELECT Contacts
FROM [View_ContactsByCampaign] Con
WHERE Con.Campaign = C.Campaign) / handleTime AS ContactPerTime
FROM [CALL] C
GROUP BY campaign;
但是,由于您拥有的是子查询,因此最好使用APPLY
. 大概是这样的::
SELECT campaign,
ISNULL(SUM(CAST (HandleTime AS bigint)), 0) AS handleTime,
Con.Contacts
Con.Contacts / handleTime AS ContactPerTime
FROM [CALL] C
CROSS APPLY(SELECT Contacts
FROM [View_ContactsByCampaign] ca
WHERE ca.Campaign = C.Campaign) Con
--Considering that Contacts was returned from a subquery, it's likely a "safe"
--assumption it will return 1 row. If it didn't, then your previous query
--would have errored anyway.
GROUP BY campaign, Contacts;
作为参考,请查看语句的逻辑处理顺序SELECT
:其中指出:
相反,因为
SELECT
子句是第 8 步,所以在该子句中定义的任何列别名或派生列都不能被前面的子句引用。但是,它们可以被后续的子句(例如ORDER BY
子句)引用。
ORDER BY
实际上是唯一可以在语句的同一部分通过别名引用列的地方。
推荐阅读
- mysql - Mysql在日期类型varchar中选择唯一值
- mysql - 加入字符串修改(替换、连接、修剪)
- c# - c# android上的数据库访问代码,带有角度的nativescript
- vue.js - Vue - 如何在模板中定义变量
- c++ - 用 (const vector) 实现的 Floyd 算法
& t : 航班), 't' 上存储的值是什么 - xamarin - 如何:使用 DI/IoC 在 Prism 中管理类似类型的单例
- android-source - 构建aosp时如何设置MAC地址和其他密钥?
- python - 无法访问 div,使用 BeautifulSoup
- .net - Azure Pipelines:任务 PublishBuildArtifacts 避免 zip
- python - 用numpy找到与中位数差异最大的索引