2014-02-24 2 views
1

CROSS APPLY 연산자를 발견했으며 계산을 위해 파생 열을 조작하는 데 매우 유용하다는 인상하에있었습니다. 특히 첫 번째 크로스로 실제로 작동 적용, 난 정말 오류를 이해하지 못하는TSQL 교차 계산 및 백분율 적용

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

:

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 

하지만 다음과 같은 오류가 발생합니다 :

그래서, 나는 다음과 같은 시도 격리. 방금 개념이 완전히 틀렸어?

답변

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