没有GROUP BY的SQL聚合

时间:2009-09-10 16:10:59

标签: sql sql-server tsql

我正在试图确定是否有办法优雅地实现这一目标。我有一个问题:

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个字段,并且是的,我需要所有专栏。)

我也理解我可以将其移到代码级别,只选择任务列表,然后再执行另一个查询来获取成本数据。我本来希望避免这种情况。

另外,我不能将其设为存储过程,因为这不是我的数据库。

有什么想法吗?

谢谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

为了任何搜索此功能的人的利益,窗口函数是SUM,COUNT等的便捷方式,无需GROUP BY - 否则会出现错误:

  

“...在选择列表中无效,因为它未包含在中   无论是聚合函数还是GROUP BY子句。“

通过使用空OVER (),聚合覆盖整个查询结果集:

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