2014-02-24 21 views
1

我刚刚发现了CROSS APPLY运算符,并且在操作派生列进行计算时非常有用。TSQL交叉应用与计数和总和

所以,我试过如下:

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 

,但我得到了以下错误:

Aggregates on the right side of an APPLY cannot reference columns from the left side.

我真的不理解的错误,尤其是在第一跨应用的实际工作中隔离。我刚刚得到了完全错误的概念吗?

回答

2

交叉申请在线级别的作品。

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

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

3

这些都行得通。

仅使用适用于:

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