Доступ к запросу SQL count ()

Эту задачу нужно выполнять в Access с 1 запросом. Есть 3 таблицы:

  • address {id, address, city, postalcode, country, supplierid}
  • supplier {supplierID, supplierName, nameid}
  • contactname {nameid, firstname, lastname, phone}

Мне нужно создать запрос, который приведет к следующей таблице:

{country, supplierNumber, supplierName, firstname, lastname, phone}

Где supplierNumber - количество компаний в конкретной стране.

Для стран с только 1 компанией поля country, supplierName, firstname, lastname, phone должны быть заполнены; с 2 и более компаниями поля country, supplierNumber должны быть заполнены.

Итак, у меня возникла простая идея использовать:

SELECT COUNT() ... 
FROM ... INNER JOIN ... ON ...
HAVING COUNT() ...
GROUP BY ...
UNION
...

Но у меня было много проблем. GROUP BY требует всех полей, которые принимает SELECT из-за COUNT(); UNION требует равного количества полей в таблицах, поэтому, возможно, вторая таблица должна быть дополнена полями NULL или чем-то еще. Так что я понятия не имею, как реализовать эту задачу. Помогите, пожалуйста.

Итак, какова ваша попытка с этим?

Yogesh Sharma 27.07.2018 19:23

Я написал, что пытался создать запрос с описанной выше структурой, но безуспешно.

gillz1 27.07.2018 19:26

Почему голосование против? Во-первых, публиковать мою попытку бесполезно, потому что она абсолютно не работает, во-вторых, я точно описал структуру и ошибки, которые у меня были во время моей попытки. Наконец, я безуспешно искал в Интернете похожие примеры и даже не знаю принципа, по которому эта задача должна быть реализована.

gillz1 27.07.2018 20:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
125
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Рассмотрите возможность объединения ваших таблиц уровня единиц с запросом агрегированного уровня:

SELECT a.country, agg.supplierNumber, s.supplierName, c.firstname, c.lastname, c.phone
FROM ((supplier s
INNER JOIN contact c ON c.nameid = s.nameid)
INNER JOIN address a ON s.supplierid = a.supplierid)
LEFT JOIN 
   (SELECT sub_a.country, COUNT(*) AS supplierNumber
    FROM address sub_a
    INNER JOIN supplier sub_s ON sub_a.supplierid = sub_s.supplier_id
    GROUP BY sub_a.country) AS agg
ON agg.country = a.country

Ух ты, очень умная идея, и вроде бы она работает, но в итоговой таблице есть все поля для каждой страны!

gillz1 28.07.2018 10:25
Ответ принят как подходящий

Предполагая, что address.supplierid всегда заполнен действительным supplierid, а supplier.nameid всегда заполнен действительным nameid, вы можете достичь желаемого результата, используя запрос UNION, подобный следующему. Первая часть выбирает страну и поставщика / контактное лицо для стран только с одним поставщиком, вторая часть выбирает все страны с более чем одним поставщиком (страны с более чем одним адресом):

SELECT a.country, 1 AS supplierNumber, s.supplierName, c.firstname, c.lastname, c.phone
FROM (address AS a INNER JOIN supplier AS s ON a.supplierid = s.supplierid) 
  INNER JOIN contactname AS c ON s.nameid = c.nameid
WHERE ((a.country) In (SELECT country FROM address GROUP BY country HAVING Count(*)=1))
UNION
SELECT a.country, Count(*), Null, Null, Null, Null
FROM address AS a GROUP BY country HAVING Count(*)>1

WolfgangK, работает отлично, просто потрясающе ... Огромное Вам спасибо! Так много неявных функций в sql!

gillz1 28.07.2018 17:29

Другие вопросы по теме