SQL агрегирует без GROUP BY - PullRequest
       26

SQL агрегирует без GROUP BY

2 голосов
/ 10 сентября 2009

Я пытаюсь определить, есть ли способ сделать это элегантно. У меня есть запрос:

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, но я пытаюсь найти изящный способ НЕ объяснять каждое из полей таблицы TASK в GROUP BY (есть около 100 полей, и да, мне нужны все столбцы).

Я также понимаю, что могу переместить это на уровень кода и выбрать только список задач, а затем выполнить другой запрос, чтобы получить данные о затратах. Я надеялся избежать этого.

Кроме того, я не могу сделать этот процесс хранимым, потому что это не моя база данных.

Есть идеи?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 10 сентября 2009
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
2 голосов
/ 10 сентября 2009
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 голосов
/ 12 июня 2017

Для тех, кто ищет это, оконные функции - это удобный способ SUM, COUNT и т. Д. Без необходимости в GROUP BY - в противном случае вы получите ошибку:

"... неверен в списке выбора, потому что он не содержится в либо агрегатная функция, либо предложение GROUP BY. "

Используя пустой OVER (), агрегаты охватывают весь набор результатов запроса:

SELECT
    Col1,
    Col2,
    SUM(Col3) OVER () AS SumCol3,
    COUNT(Col1) OVER () AS NumRows
FROM Table1
0 голосов
/ 10 сентября 2009

Использовать суб-выбор.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...