У меня есть таблица со следующей схемой:
Table1
Id varchar2
name varchar2
class varchar2
JoinDate date
size number
Первичный ключ - это идентификатор, имя, класс.
Когда я запрашиваю конкретный идентификатор, имя, которое я хочу вернуть, сумма (размер), сгруппированная по классу, и результаты должны быть основаны на следующих критериях:
- Рассматривать только строки с другим Id, как у меня
- Рассматривать только строки с тем же именем, что и у меня
- Если комбинация класса имен для другого идентификатора совпадает с комбинацией класса имен для моего идентификатора, то включите размер в сумму, если JoinDate меньше моего joinDate для этой комбинации класса имен
Если комбинация класса имен для другого идентификатора не совпадает с комбинацией класса имен для моего идентификатора, то всегда включайте размер в сумму
select
others.class,
sum( case when others.class = mine.class and others.joindate <= mine.joindate then size
when others.class = mine.class and others.joindate > mine.joindate then 0
else size ) total_size
from
table1 others
inner join table1 mine
on mine.name = others.name and
mine.id != others.id
where mine.name = :name and
mine.id = :id
group by class
Выше приведен запрос, но он не дает того, что я хочу, потому что не решает приведенный ниже случай:
Id Name Class JoinDate Size
OtherId Mark Class1 Aug-20-2010 1
OtherId Mark Class2 Aug-20-2010 1
OtherId Mark Class3 Aug-30-2010 1
MyId John Class1 Aug-21-2010 1
MyId John Class4 Aug-21-2010 1
MyId John Class3 Aug-29-2010 1
То, что я хочу, это:
Class1 1
Class2 1
Class3 0
Class4 0
Это не то, что я получаю.