【问题标题】:TSQL Cross Apply with Count and Sum带有计数和总和的 TSQL 交叉应用
【发布时间】:2015-03-05 20:51:08
【问题描述】:

我刚刚发现了 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 右侧的聚合不能引用来自 左边。

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

【问题讨论】:

    标签: tsql cross-apply


    【解决方案1】:

    交叉应用适用于行级别。

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

    您的聚合对每行没有意义。

    【讨论】:

      【解决方案2】:

      这些都行。

      仅使用应用:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2015-04-18
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多