1

我刚刚发现了 CROSS APPLY 运算符,并认为它在操作派生列以进行计算时非常有用。

所以,我尝试了以下方法:

SELECT leadYear,TotalLeadsCalled,SuccessLeadsCalled,SuccessLeadsPercent
FROM dbo.tblBinOutboundCallActivity 
CROSS APPLY(VALUES (YEAR(leadactivitydate))) AS a1(leadyear) 
CROSS APPLY(VALUES (COUNT(leadStatusID))) AS a2(TotalLeadsCalled) 
CROSS APPLY(VALUES (COUNT(CASE WHEN leadStatusID = 2 THEN 1 ELSE NULL END))) AS a3(SuccessLeadsCalled) 
CROSS APPLY(VALUES (SUM((SuccessLeadsCalled/TotalLeadsCalled)*100))) AS a4(SuccessLeadsPercent) 
GROUP BY leadYear

但我收到以下错误:

APPLY 右侧的聚合不能引用左侧的列。

我不太明白这个错误,尤其是第一个交叉应用实际上是孤立地工作的。我是不是完全搞错了这个概念?

4

2 回答 2

6

交叉应用在行级别上工作。

“对于左边的每一行,我们在右边应用一个函数”。

您的聚合在每行基础上没有意义。

于 2014-02-24T13:19:05.323 回答
4

这些会起作用。

仅使用应用:

SELECT leadYear,TotalLeadsCalled,SuccessLeadsCalled,SuccessLeadsPercent
FROM dbo.tblBinOutboundCallActivity a
    CROSS APPLY (SELECT YEAR(leadactivitydate) leadyear FROM dbo.tblBinOutboundCallActivity WHERE YEAR(leadactivitydate) = YEAR(a.leadactivitydate)) a1
    CROSS APPLY (SELECT COUNT(leadStatusID) TotalLeadsCalled FROM dbo.tblBinOutboundCallActivity WHERE YEAR(leadactivitydate) = a1.leadyear) a2
    CROSS APPLY (SELECT COUNT(CASE WHEN leadStatusID = 2 THEN 1 ELSE NULL END) SuccessLeadsCalled FROM dbo.tblBinOutboundCallActivity WHERE YEAR(leadactivitydate) = a1.leadyear) a3
    CROSS APPLY (SELECT 100.*SuccessLeadsCalled/TotalLeadsCalled SuccessLeadsPercent) a4
GROUP BY leadYear,TotalLeadsCalled,SuccessLeadsCalled,SuccessLeadsPercent

CTE & 应用:

WITH Years AS
(
    SELECT YEAR(leadactivitydate) leadyear
    FROM dbo.tblBinOutboundCallActivity
    GROUP BY YEAR(leadactivitydate)
)
    SELECT leadYear,TotalLeadsCalled,SuccessLeadsCalled,SuccessLeadsPercent
    FROM Years      
        CROSS APPLY (SELECT COUNT(leadStatusID) TotalLeadsCalled FROM dbo.tblBinOutboundCallActivity WHERE YEAR(leadactivitydate) = leadyear) a2
        CROSS APPLY (SELECT COUNT(CASE WHEN leadStatusID = 2 THEN 1 ELSE NULL END) SuccessLeadsCalled FROM dbo.tblBinOutboundCallActivity WHERE YEAR(leadactivitydate) = leadyear) a3
        CROSS APPLY (SELECT 100.*SuccessLeadsCalled/TotalLeadsCalled SuccessLeadsPercent) a4
于 2014-04-29T18:34:50.317 回答