У меня есть таблица под названием «Пожертвования». Мне нужно найти всех d_names, которые делали пожертвования более одного раза в день. Я понятия не имею, как объединить эти 2 запроса. Любая помощь приветствуется. Это моя таблица. 3 поля. доноры получатели giftdate донор мог сделать подарок получателю только один раз. Доноры могут делать пожертвования более одного раза, а получатели - более одного раза. Мне просто нужно найти, кто дарил подарок более одного раза в день. Но мне нужно знать, когда и кому.

-1
user3667148 23 Май 2014 в 04:22

4 ответа

Лучший ответ

OP теперь говорит, что он использует Oracle, не может использовать GROUP BY и хочет, чтобы все поля в таблице. Ему нужны доноры, которые делали пожертвования более одного раза в любой день (независимо от получателей).

select distinct d1.* 
 from Donates d1
       inner join Donates d2
        on  d1.donors = d2.donors
        and trunc(d1.giftdate) = trunc(d2.giftdate)
        and d1.rowid < d2.rowid
 ;
0
codenheim 23 Май 2014 в 02:17

Вы правы, что использовали бы COUNT, и вы использовали бы предложение HAVING для фильтрации:

select d_name
from Donates
group by d_name
having count(1) > 1

Конечно, вам нужно будет добавить любые другие пункты, чтобы удовлетворить ваши требования, такие как ограничение или группировка по дням. Самый простой - ограничить результаты одним днем ​​(в одном запросе можно использовать как WHERE, так и HAVING):

select d_name
from Donates
where g_date = @Date
group by d_name
having count(1) > 1

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

select *
from Donates
inner join (
    select d_name
    from Donates
    where g_date = @Date
    group by d_name
    having count(1) > 1
) x on Donates.d_name = x.d_name

После всех комментариев в разных местах, я думаю, вы наконец ищете что-то вроде:

select d_name, r_name, g_date
from Donates
inner join (
    select d_name, g_date
    from Donates
    group by d_name, g_date
    having count(1) > 1
) x on Donates.d_name = x.d_name and Donates.g_date = x.g_date
3
lc. 23 Май 2014 в 01:19
select *
from Donates
where d_name in (
    select d_name
    from Donates 
    where cast(d_date as Date) in (
        select cast(d_date as Date)
        from Donates 
        group by cast(d_date as Date)
        having count(cast(d_date as Date)) > 1
    )
    group by d_name
)
0
user1417835 23 Май 2014 в 00:55

Я бы посоветовал просто использовать аналитические функции:

select d.*
from (select d.*, count(*) over (partition by trunc(d.giftdate), d.name) as cnt
      from donates d
     ) d
where cnt > 1;
0
Gordon Linoff 23 Май 2014 в 03:13