Как исправить «Вы пытались выполнить запрос, который не содержит X в качестве агрегатной функции» - PullRequest
0 голосов
/ 17 мая 2019

В моей базе данных есть таблица «Клиенты», которая включает следующее:

CustomerID | SupplierID

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

У меня есть конкретный клиент, у которого CustomerID = X

Я пытаюсь написать запрос на SQL, который возвращает таблицу клиентов, которые удовлетворяют уравнению: количество взаимных поставщиков между пользователем и X> 80% от числа поставщиков клиента X.

Мне удалось получить таблицу:

CustomerID1 | CustomerID2 | Num of Mutual Suppliers

где CustomerID1 = X во всех строках, но я не могу указать количество поставщиков, которых имеет клиент X, чтобы выбрать только тех, кто удовлетворяет условию.

select user1
     , user2
     , num_in_common
     , COUNT(*)
  from (select f1.CustomerID as user1, f2.CustomerID as user2, count(*) as num_in_common
from Customers f1 inner join
     Customers f2
     on f1.SupplierID = f2.SupplierID
group by f1.CustomerID, f2.CustomerID)
where user1 = X;

Я ожидал получить следующую таблицу:

CustomerID1 | CustomerID2 | Num of Mutual Suppliers | Num of X's Suppliers

но я получил ошибку «Вы пытались выполнить запрос, который не включает указанное выражение« user1 »как часть агрегатной функции».

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

С самостоятельным объединением таблицы и затем group by для агрегирования:

select 
  c.customerid CustomerID1, 
  m.customerid CustomerID2, 
  count(*) num_in_common,
  (select count(*) from customers where customerid = c.customerid) totalofX
from customers c inner join customers m
on m.customerid <> c.customerid and m.supplierid = c.supplierid 
where c.customerid = X 
group by c.customerid, m.customerid
having num_in_common > 0.8 * totalofX

См. Демоверсию .

0 голосов
/ 18 мая 2019

Не думаю, что предыдущий ответ был верным, поэтому я просто предоставляю более точный ответ, теперь, когда ОП уточнил вопрос.

select x.customerid, c.customerid,
       (count(*) / num_x) as ratio
from customers c cross join
     (select @X as customerid, count(*) as num_x
      from customers c
      where c.customerid = @X
     ) x
where exists (select 1
              from customers cx
              where cx.supplierid = c.supplierid and
                    cx.customerid = @X
             )
group by c.customerid, x.num_x
having count(*) / x.num_x >= 0.8
order by ratio desc;

Здесь является демонстрацией (без данных) того, что код синтаксически корректен.

Здесь является демонстрацией, которая работает с фиктивными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...