2013-01-24 88 views
0

當我嘗試運行代碼時出現以下錯誤,「無法對包含聚合或子查詢的表達式執行聚合函數」。無法執行聚合函數

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 
+3

你在數*做一個計數(1或0)。這就是不喜歡的。你需要將它們作爲獨立的步驟來完成。創建一個首先獲得計數* 1或0的子查詢,然後對其執行COUNT操作。雖然爲什麼你會指望我不太明白,因爲計數0或計數1是相同的。無論如何,這是核心問題。如果你在你的問題中解釋目標/預期結果,或許我們可以給你一個滿足你需求的查詢。 –

+0

'COUNT(COUNT(TR.EMP_TNG_STT_DT)*(CASE When IsNumeric([COL_TBL_VCOURSE]。[LENGTH])= 1 THEN [COL_TBL_VCOURSE]。[LENGTH] ELSE 0 END))'你能解釋一下這個是什麼意思嗎? –

回答

2

您不能像這樣嵌套聚合函數。你將不得不使用子查詢得到的結果:

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 

不知道你的意圖是與查詢什麼,你可能需要使用sum()

0

聽起來也許你混淆了更換外count() 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