2014-10-25 4 views
0

у меня есть три таблицы в моей Oracle DB:

запросов с агрегирования данных из 2 таблиц

народов:

IdPerson PK 
Name 
Surname 

Прибыль:

IdEarning 
IdPerson 
EarningValue 

Награды:

IdAward PK 
IdPerson FK 
AwardDescription 
  • Человек может иметь много прибыли.
  • Заработок может иметь много или вообще никаких заработка.
  • У человека может быть много наград, одна награда или никакая награда.

Я хочу, чтобы сделать запрос, который будет возвращать 3 колонки:

  • Фамилия
  • SUM всех EarningValue лица с этой фамилией
  • COUNT всех наград за этого человека

Важно, что мне также нужно отображать: 0 значение, если у человека нет награды или заработка. Существует вероятность, что человек имеет награду, но не имеет никакого заработка.

Можно ли сделать такой запрос?

+0

Он работал для меня, когда я сделал тест колонок и сделал этот код ВЫБРАТЬ Peoples.Surname, SUM (Earnings.EarningValue) как доход, COUNT (Награды. IdPerson) как Награды ИЗ народов INNER JOIN Прибыль пО Peoples.IdPerson = Earnings.IdPerson INNER JOIN Награды пО Peoples.IdPerson = Награды.IdPerson ГРУППА НА Peoples.IdPerson; –

ответ

0
SELECT p.IdPerson, 
     p.Surname, 
     NVL(SUM(e.EarningValue), 0) as SumEarnings, 
     COUNT(a.IdAward) as CntAwards 
FROM Peoples p 
LEFT JOIN Earnings e ON p.IdPerson = e.IdPerson 
LEFT JOIN Awards a ON p.IdPerson = a.IdPerson 
GROUP BY p.IdPerson, 
     p.Surname; 

Что возвращает это:

SELECT p.Surname, 
     (SELECT NVL(SUM(e.EarningValue), 0) 
     FROM Earnings e WHERE e.IdPerson = p.IdPerson) as SumEarnings, 
     (SELECT COUNT(aIdAward) 
     FROM Awards a WHERE a.IdPerson = p.IdPerson) as CntAwards 
FROM Peoples p 
+0

Есть еще одна проблема: слишком высокие значения рассчитаны. Например, 1 человек, которые имеют 6 награды, в этом калькуляторе имеют 36 наград –

+0

@ user2838197 Я создал edit. – slavoo

+0

Это то, что мне нужно! Спасибо! –

0

Да, это возможно, вы просто должны соединить таблицы

SELECT Peoples.Surname, SUM(Earnings.EarningValue) as Earnings, COUNT(Awards. IdPerson) as Awards 
FROM Peoples 
INNER JOIN Earnings 
ON Peoples.IdPerson = Earnings.IdPerson 
INNER JOIN Awards 
ON Peoples.IdPerson = Awards.IdPerson 
GROUP BY Peoples.IdPerson; 
+0

Используйте 'left join' –

+0

Да. Thanx Для редактирования –

+0

Может понадобиться 'coalesce' (показать' 0' над 'null') для' sum'. – sgeddes

0

да из-конечно, это возможно. вам просто нужно присоединиться к таблицам, используя несколько запросов на объединение, а затем применить функцию sum(), чтобы получить сумму заработка и Count(), чтобы подсчитать число. наград. Попробуйте ниже запрос:

SELECT P.Surname, 
     Sum(E.EarningValue)AS Total_Earnings, 
     Count(A.IdAward) AS total_awards 
FROM Peoples P 
     LEFT JOIN Earnings E 
       ON P.IdPerson = E.IdPerson 
     LEFT JOIN Awards A 
       ON A.IdPerson = P.IdPerson 
GROUP BY P.IdPerson; 
+1

Добро пожаловать в Stack Overflow. Это хорошая идея предложить некоторые комментарии, чтобы помочь людям понять, почему ваш ответ решит их проблему. –

+0

group by P.Surname – slavoo

Смежные вопросы