我正在试图确定是否有办法优雅地实现这一目标。我有一个问题:
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 :(得分: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