【问题标题】:Cannot Perform Aggregate Function无法执行聚合功能
【发布时间】:2013-01-25 03:47:11
【问题描述】:

当我尝试运行代码时出现以下错误:“无法对包含聚合或子查询的表达式执行聚合函数。”

SELECT dbo.COL_TBL_WAGES.MANUAL, dbo.COL_TBL_VCOURSE.TNG_MDA_TYP_CD, 
    dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR, 
    COUNT(dbo.COL_2010_TRN_RESULTS2.EMP_TNG_STT_DT) AS CountOfEMP_TNG_STT_DT,
    dbo.COL_MASTER_COURSE_LIST.Length, 
    COUNT(
        COUNT(dbo.COL_2010_TRN_RESULTS2.EMP_TNG_STT_DT) * (
            CASE WHEN IsNumeric([COL_TBL_VCOURSE].[LENGTH]) = 1 
            THEN [COL_TBL_VCOURSE].[LENGTH] 
            ELSE 0 
            END
        )
    ) AS Total_Hours
FROM dbo.COL_TBL_WAGES INNER JOIN
    dbo.COL_2010_TRN_RESULTS2 ON dbo.COL_TBL_WAGES.[Job Group Code] =
        dbo.COL_2010_TRN_RESULTS2.JOB_GRP_CD INNER JOIN
    dbo.COL_MASTER_COURSE_LIST ON dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR = 
        dbo.COL_MASTER_COURSE_LIST.[GEMS Code] INNER JOIN
    dbo.COL_TBL_VCOURSE ON dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR = 
        dbo.COL_TBL_VCOURSE.TNG_SYS_NR
GROUP BY dbo.COL_MASTER_COURSE_LIST.Length, dbo.COL_TBL_WAGES.MANUAL,
    dbo.COL_TBL_VCOURSE.TNG_MDA_TYP_CD, 
    dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR

【问题讨论】:

  • 您正在对计数 *(1 或 0)进行计数。这就是它不喜欢的。您需要将它们作为独立的步骤进行。创建一个首先获取 count * 1 或 0 的子查询,然后对其执行 COUNT。虽然你为什么会算我不太明白,因为计数 0 或计数 1 是相同的。无论如何,这是核心问题。如果您在问题中解释了目标/预期结果,也许我们可以为您提供适合您需求的查询。
  • COUNT(COUNT(TR.EMP_TNG_STT_DT) * (CASE WHEN IsNumeric([COL_TBL_VCOURSE].[LENGTH]) = 1 THEN [COL_TBL_VCOURSE].[LENGTH] ELSE 0 END))你能解释一下这是什么意思吗?

标签: sql-server


【解决方案1】:

你不能像这样嵌套聚合函数。您必须使用子查询来获得结果:

select MANUAL,
  TNG_MDA_TYP_CD,
  TNG_SYS_NR,
  CountOfEMP_TNG_STT_DT,
  Length,
  count(Total_Hours) Total_Hours,
from
(
  SELECT dbo.COL_TBL_WAGES.MANUAL, 
    dbo.COL_TBL_VCOURSE.TNG_MDA_TYP_CD, 
    dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR, 
    COUNT(dbo.COL_2010_TRN_RESULTS2.EMP_TNG_STT_DT) AS CountOfEMP_TNG_STT_DT, 
    dbo.COL_MASTER_COURSE_LIST.Length, 
    COUNT(dbo.COL_2010_TRN_RESULTS2.EMP_TNG_STT_DT) 
            * (CASE WHEN IsNumeric([COL_TBL_VCOURSE].[LENGTH]) = 1 
               THEN [COL_TBL_VCOURSE].[LENGTH] 
               ELSE 0 END) AS Total_Hours
  FROM dbo.COL_TBL_WAGES 
  INNER JOIN dbo.COL_2010_TRN_RESULTS2 
    ON dbo.COL_TBL_WAGES.[Job Group Code] = dbo.COL_2010_TRN_RESULTS2.JOB_GRP_CD 
  INNER JOIN dbo.COL_MASTER_COURSE_LIST 
    ON dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR = dbo.COL_MASTER_COURSE_LIST.[GEMS Code] 
  INNER JOIN dbo.COL_TBL_VCOURSE 
    ON dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR = dbo.COL_TBL_VCOURSE.TNG_SYS_NR
  GROUP BY dbo.COL_MASTER_COURSE_LIST.Length, 
    dbo.COL_TBL_WAGES.MANUAL, 
    dbo.COL_TBL_VCOURSE.TNG_MDA_TYP_CD, 
    dbo.COL_2010_TRN_RESULTS2.TNG_SYS_NR
) src
group by MANUAL,
  TNG_MDA_TYP_CD,
  TNG_SYS_NR,
  CountOfEMP_TNG_STT_DT,
  Length

在不知道查询的意图的情况下,您可能需要将外部 count() 替换为 sum()

【讨论】:

    【解决方案2】:

    听起来您可能将 COUNT() 与 SUM() 混淆了。 COUNT 只计算所有非 NULL 值。 SUM 添加您提供的任何数值。

    例如,如果您对以下值执行 COUNT 和 SUM,您将得到以下结果。

    VAL
    100
    50
    25
    0
    
    SUM(VAL) = 175
    COUNT(VAL) = 4
    

    这就是我认为你真正追求的目标:

    SUM(
            CASE WHEN IsNumeric([COL_TBL_VCOURSE].[LENGTH]) = 1 
            THEN 1
            ELSE 0 
            END
        ) AS Total_Hours
    

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2021-09-01
      • 2021-07-24
      • 2021-12-17
      • 2016-02-24
      • 2013-11-02
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多