Как отобразить строки, которые сделали как минимум два пожертвования? - PullRequest
0 голосов
/ 10 ноября 2019

Я не могу понять, как правильно использовать условия Count или GROUP By, и я не могу отобразить строки, которые делают более 2 пожертвований.

Я предпринял неудачную попытку COUNTи предложение GROUP BY.

insert into DD (Donor_ID, Donation_ID, Donation_Type, Donation, Inventory_ID) values 
   (1, 1, 'Food', 'Oranges', 1); -- **Code to display**
   insert into DD (Donor_ID, Donation_ID, Donation_Type, Donation, Inventory_ID) values 
   (2, 2, 'Currency', 200, 2); -- **Code to display**
   insert into DD (Donor_ID, Donation_ID, Donation_Type, Donation, Inventory_ID) values 
   (2, 3, 'Currency', 300, 2); -- **Code to display**
   insert into DD (Donor_ID, Donation_ID, Donation_Type, Donation, Inventory_ID) values 
   (1, 4, 'Currency', 400, 2); -- **Code to display**
   insert into DD (Donor_ID, Donation_ID, Donation_Type, Donation, Inventory_ID) values 
   (3, 5, 'Currency', 500, 2); -- NOT TOO display

select di.Donor_Name DI, 
    acz.Address_City ACZ, 
    dd.Donation_Type DD, 
    dd.Donation      DD,
    COUNT(*)

from DI di, ACZ acz, DD dd  
where  di.Donor_ID = acz.Address_ID 
AND (acz.Address_City = 'ATHENS' OR acz.Address_City = 'Watkinsville') 
AND di.Donor_ID > 1
GROUP BY di.Donor_Name DI, 
    acz.Address_City ACZ, 
    dd.Donation_Type DD, 
    dd.Donation      DD;

В результате я получаю ошибку ORA-00933. В результате я хочу прокомментировать код, указанный как «- Код для отображения» для отображения.

Ответы [ 3 ]

1 голос
/ 10 ноября 2019

Вы должны использовать предложение having, так как оно применяется после группировки и работает с aggregate результатом функции. В вашем случае условие должно быть count(1) > 1

Использовать group by и having следующим образом:

select di.Donor_Name DI, 
    acz.Address_City ACZ, 
    dd.Donation_Type DD, 
    dd.Donation      DD,
    COUNT(*)
from DI di, ACZ acz, DD dd  
where  di.Donor_ID = acz.Address_ID 
AND (acz.Address_City = 'ATHENS' OR acz.Address_City = 'Watkinsville') 
AND di.Donor_ID > 1
GROUP BY di.Donor_Name, 
    acz.Address_City, 
    dd.Donation_Type, 
    dd.Donation
Having count(1) > 1; -- use this having

Обратите внимание, что вы должны использовать стандартные соединения ANSI.

Ура !!

1 голос
/ 10 ноября 2019

при поиске образца данных кажется, что вы пропустили соединение между DI и DD

Не следует использовать одно и то же имя для таблицы и псевдонима (общий код SQL не учитывает регистр)

Вам следуетиспользуйте явный синтаксис объединения (а не старый неявный синтаксис объединения 1992 года в зависимости от того, где)

и, по крайней мере, для двух пожертвований можно использовать число (*)> 1

select di.Donor_Name DI, 
    acz.Address_City ACZ, 
    dd.Donation_Type DD, 
    dd.Donation      DD,
    COUNT(*)
from DI 
INNER JOIN ACZ  ON  di.Donor_ID = acz.Address_ID 
        AND (acz.Address_City = 'ATHENS' OR acz.Address_City = 'Watkinsville') 
        AND di.Donor_ID > 1
INNER JOIN  DD  ON DD.Donor_ID =  di.Donor_ID
GROUP BY di.Donor_Name DI, 
    acz.Address_City ACZ, 
    dd.Donation_Type DD, 
    dd.Donation      DD
HAVING count(*) > 1 
0 голосов
/ 10 ноября 2019

Вот правильный способ написания запроса:

select di.Donor_Id, di.Donor_Name,
       count(distinct di.donation_id) as num_donations
from di join
     dd
     on di.Donor_ID = dd.Donor_id join   -- guessing the JOIN conditions
     acz
     on acz.Donor_ID = di.Donor_ID       -- guessing the JOIN conditions
where acz.Address_City in ('ATHENS', 'Watkinsville') and
      di.Donor_ID > 1
group by di.Donor_Id, di.Donor_Name
having count(*) >= 2;

Примечания:

  • Всегда используйте правильный, явный, стандартный синтаксис JOIN. Никогда не используйте запятые в предложении FROM.
  • Вы не указываете условия JOIN, поэтому я предполагаю, что donor_id есть в каждой таблице.
  • Вы не можете выбрать «пустые» столбцы пожертвований, если хотите подсчитать количество пожертвований на человека.
  • Донор может (предположительно) иметь несколько адресов, поэтому, если вы хотите считать пожертвования, используйте COUNT(DISTINCT).
  • В Oracle учитывается регистр, поэтому необычно видеть одно название города во всех заглавных буквах, а другое - нет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...