SQL Sum () с коррелированным подзапросом - PullRequest
1 голос
/ 08 сентября 2011

У меня есть две таблицы: фонд и предметы. У пунктов есть поле, названное fundID, которое связано с идентификатором таблицы фонда. У предметов также есть поле цены.

Вот упрощенный пример двух таблиц:

FUND
ID    fundName
1     maintenance
2     books
3     development
4     media


ITEMS
ID    price    fundID
1     $10        2
2     $20        4
3     $5         4
4     $8         1
5     $10        3
6     $12        4

Я хочу создать запрос, который даст мне название каждого фонда и сумму всех цен для предметов, которые связаны с этим фондом через поле fundID. Я пробовал несколько методов, таких как наличие коррелированного подзапроса в SUM (), а также в WHERE, и я получаю ошибки.

Если бы кто-то мог указать мне правильное направление, я был бы признателен.

Ответы [ 4 ]

3 голосов
/ 08 сентября 2011

Попробуйте это:

SELECT f.fundname,
       SUM(i.price)
FROM   fund f
       JOIN items i
         ON i.fundid = f.id
GROUP  BY f.fundname  
2 голосов
/ 09 сентября 2011

Нет веской причины делать это таким образом, учитывая структуру вашей таблицы, однако вопрос все же задает вопрос о подзапросе, и структура таблицы упрощается.

Таким образом, это даст те же результаты, что и для JOIN / GROUP BY

SELECT f.fundname, 
       coalesce(i.price,0) price
FROM   fund f 
       LEFT JOIN (SELECT fundid, 
                          SUM(price) price 
                   FROM   items i 
                   GROUP  BY fundid) i 
         ON f.fundid = i.fundid 

. Обратите внимание, что COALESCE / LEFT JOIN существует, если вы хотите 0 для средств, у которых нет элементов.

0 голосов
/ 08 сентября 2011
SELECT f.fundid, f.fundName, SUM(price)
FROM Fund f 
   INNER JOIN ITEMS i ON i.fundId = f.fundId
GROUP BY f.FUNDID

Если у вас много средств, Id фонда, вероятно, лучше сгруппировать по

0 голосов
/ 08 сентября 2011

Попробуйте это

select fundName,sum(price) as  TotPrice
from Funds f
join Items g on g.id=f.id
group by f.fundName
...