2016-10-26 4 views
-1

я есть таблица, скажем Table1 следующей структуры:SQL-запросов на различных комбинаций строк

name varchar(20), 
amount integer 

с сгенерированного ID поля. ни одно из указанных выше полей не может быть нулевым, но может повторяться - не обязательно уникально.

Я должен запросить список name с так, что для каждого из имен в списке, то должно выполняться условие:

сумма amount по большей мере k числа поле (ов) для данного имени должно превышать 1000, где k = 3.

так, например, имя Смита появляется в одной строке только с количеством 1005 является результатом в этом запросе. имя Джонса, появляющееся 4 раза с суммами 200 каждый, не будет возвращено в этом запросе, но было бы, если бы одна из его сумм составляла 700.

Как это сделать? один, о котором я могу думать, является внутренним соединением таблицы с собой дважды, на поле name, где условие представляет собой сумму из трех сумм в результирующей таблице> = 1000, а идентификаторы строк различны. Но должен быть лучший способ. Эта логика не в состоянии это k бы большое количество, скажем, 100.

ответ

1

Я думаю, что два присоединяется называются для:

select distinct t1.name 
from table1 t1 left join 
    table1 t2 
    on t1.name = t2.name and t1.id < t2.id left join 
    table1 t3 
    on t2.name = t3.name and t2.id < t3.id 
where coalesce(t1.amount, 0) + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 1000; 

left join Это s, так что вы можете найти комбинации с менее 3-х строк.

distinct объясняется тем, что одно имя может иметь несколько таких комбинаций.

Сравнение в поле id состоит в том, чтобы предотвратить объединение одной строки в комбинацию более одного раза.

+0

прочитайте вопрос. – user6762070

+0

@ пользователь6762070. , , «Как это сделать?» Вопрос довольно ясен. Если вам не нужен такой ответ, вы должны включить его в свой вопрос. –

+1

@ пользователь6762070 .. это грубо. вы задали вопрос, и несправедливо публиковать такие комментарии по ответам. –

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