2017-04-19 77 views
1

消息147,級別15,狀態1,過程vw_OverBudget,10號線[批量起始行59]
聚合不應出現在WHERE子句中,除非它是在含有HAVING子句或選擇列表在子查詢中,並且被聚合的列是外部參考。如何解決where子句中的聚合?

代碼:

CREATE VIEW vw_OverBudget 
AS 
    SELECT 
     p.projectName, 
     SUM(a.costtodate) AS sumActivityCosts, 
     p.fundedbudget 
    FROM 
     Project AS p 
    FULL OUTER JOIN 
     Activity a ON p.projectid = a.projectid 
    WHERE 
     a.activityId IS NULL 
     AND p.projectid IS NOT NULL 
     AND SUM(a.costtodate) > p.fundedbudget 
    GROUP BY 
     p.projectID 

回答

1

一個full outer join不需要此查詢。爲了您的邏輯,left join似乎是正確的:

Select p.projectName, sum(a.costtodate) AS sumActivityCosts, 
     p.fundedbudget 
From Project p left join 
    Activity a 
    on p.projectid = a.projectid 
where a.activityId is null and p.projectid is not null 
Group By p.projectName, p.fundedbudget 
having sum(a.costtodate) > p.fundedbudget; 

然而,這並沒有道理給我。如果a.activityId爲空,那麼最有可能的原因是沒有匹配。所以,我敢肯定,你只是想一個inner join沒有where條款:

Select p.projectName, sum(a.costtodate) AS sumActivityCosts, 
     p.fundedbudget 
From Project p inner join 
    Activity a 
    on p.projectid = a.projectid 
Group By p.projectName, p.fundedbudget 
having sum(a.costtodate) > p.fundedbudget; 
+0

與內加入,我看你爲什麼要與該連接類型去尋找我收到數據後,列'Project.projectName'錯誤。這是說它是無效的,因爲它不包含在聚合函數或組中? – Danny

+0

找到了解決方案,我只需要在組中添加p.projectName。 – Danny

1

SQL SERVER,也許適用於其他數據庫

缺失下組字段由

Group By 
    p.projectID 
,p.fundedbudget --- to add 

,並添加

having sum > 
在where子句

更新

刪除總和將

Create view vw_OverBudget AS 
    Select 
     p.projectName, 
     sum(a.costtodate) AS sumActivityCosts, 
     p.fundedbudget 
    From 
     Project AS p 
     full outer join Activity a ON p.projectid = a.projectid 
    WHERE 
     a.activityId is null and p.projectid is not null 
    Group By 
     p.projectID, p.fundedbudget 
having SUM(a.costtodate) > p.fundedbudget 
    go