2009-09-10 84 views
2

我試圖確定是否有辦法來完成這個優雅。我有一個查詢:SQL Aggregrates without GROUP BY

SELECT TASK.*, PROJCOST.act_cost, PROJCOST.target_cost 
FROM task 
LEFT OUTER JOIN projcost ON task.task_id = projcost.task_id 

我剛剛發現PROJCOST.target_cost和act_cost不是1比1,需要總結。我明白如何使用SUM和GROUP BY,但是我試圖找到一種優雅的方式,不必拼出GROUP BY中TASK表中的每個字段(有近100個字段,並且是的,我需要所有列)。

我也明白我可以將其移至代碼級別,只選擇任務列表,然後再執行另一個查詢以獲取成本數據。我希望避免這種情況。

此外,我不能讓這個存儲過程,因爲這不是我的數據庫。

任何想法?

謝謝。

+0

正如旁白:100場是相當大量的表。您可能需要重新考慮您的數據庫設計... – sleske 2009-09-10 16:21:10

+3

這不是我的數據庫。我在帖子中提到。 – billb 2009-09-10 16:44:40

回答

4
SELECT TASK.*, 
    (select sum (act_cost) from projcost where task_id = task.task_id) as act_cost, 
    (select sum (target_cost) from projcost where task_id = task.task_id) as target_cost 
FROM task 
+0

太棒了,謝謝。 – billb 2009-09-10 16:19:03

2
SELECT TASK.*, 
IsNull(allprojcosts.total_act_cost, 0) AS total_act_cost, 
IsNull(allprojcosts.total_target_cost, 0) AS total_target_cost 
FROM task 
LEFT OUTER JOIN (SELECT task_id, Sum(act_cost) AS total_act_cost, Sum(target_cost) AS total_target_cost 
    FROM projcost) allprojcosts ON task.task_id = allprojcosts.task_id 
0

使用子選擇。

SELECT TASK.*, sums.* 
FROM 
    task left outer join 
    (
    select task.task_id, sum(PROJCOST.act_cost), sum(PROJCOST.target_cost) 
    FROM 
     task LEFT OUTER JOIN 
     projcost ON task.task_id = projcost.task_id 
) sums ON task.task_id = sums.task_id 
0

對於任何搜索這個的好處,窗函數來總結一個方便的方式,COUNT,等等,而無需GROUP BY - 當否則你將得到錯誤:

「...在選擇列表中無效,因爲它不包含在 集合函數或GROUP BY子句中。」

通過使用空OVER(),骨料覆蓋整個查詢結果集:

SELECT 
    Col1, 
    Col2, 
    SUM(Col3) OVER() AS SumCol3, 
    COUNT(Col1) OVER() AS NumRows 
FROM Table1