2016-07-26 57 views
0

我想總結一個案例的發生。我試圖使用案件陳述的總和,但我得到這個錯誤,它如何解決?我可以在最大/最小值函數中使用case與case和?

Msg 130, Level 15, State 1, Line 3 
Cannot perform an aggregate function on an expression containing an aggregate or a subquery. 

我的代碼示例:

select 
sum(case when cast(max(ptl.RowDate)as int) = cast(Min(ptl.RowDate) as int) then 1 else 0 end) 
,DATEPART(WEEK, rowdate) week_ 
from m.dbo.tblLog ptl (nolock) 
where rowdate > GETDATE()-91 
group by DATEPART(WEEK, rowdate) 

更新: 基於評論:我想數着被訪問的網頁不同的用戶只once.I想基於每週獲得的計數大體時間。

+0

你不能那樣做。你需要重新思考並改變你的邏輯。提到你想要完成的事情。 –

+0

這個數字甚至會做什麼?無論如何,每週只有一行,總和爲1或0。 –

+0

請提供樣本數據和期望的結果。非工作查詢並不能傳達你真正想做的事情。 –

回答

1

您不能在另一箇中使用聚合函數。您需要使用子查詢或CTE:

SELECT SUM(something) as s, 
     week_ 
FROM (
    select case when cast(max(ptl.RowDate)as int) = cast(Min(ptl.RowDate) as int) then 1 else 0 end as something, 
      DATEPART(WEEK, rowdate) week_ 
    from m.dbo.tblLog ptl (nolock) 
    where rowdate > GETDATE()-91 
    group by DATEPART(WEEK, rowdate) 
    ) as res 
GROUP BY week_ 
1

替代的方式來查詢

SELECT SUM(CASE WHEN CAST(MaxRowDate AS INT) = cast(MinRowDate AS INT) THEN 1 ELSE 0 END) 
week_ 
FROM 
(

    SELECT MAX(ptl.RowDate) MaxRowDate,MIN(ptl.RowDate) MinRowDate,DATEPART(WEEK, rowdate) week_ 
    FROM m.dbo.tblLog ptl (NOLOCK) 
    WHERE rowdate > GETDATE()-91 
    GROUP BY DATEPART(WEEK, rowdate) 
)M 
GROUP BY week_ 
1

如果你只是想要一個標誌,你爲什麼要一個sum()

select (case when cast(max(ptl.RowDate)as int) = cast(Min(ptl.RowDate) as int) 
      then 1 else 0 
     end) as OneValueFlag, 
     DATEPART(WEEK, rowdate) as week_ 
from m.dbo.tblLog ptl (nolock) 
where rowdate > GETDATE() - 91 
group by DATEPART(WEEK, rowdate); 

價值會被轉換爲日期的原因也完全不清楚:

select (case when max(ptl.RowDate) = Min(ptl.RowDate) 
      then 1 else 0 
     end) as OneValueFlag, 
     DATEPART(WEEK, rowdate) as week_ 
from m.dbo.tblLog ptl (nolock) 
where rowdate > GETDATE() - 91 
group by DATEPART(WEEK, rowdate); 
相關問題