Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2015, 16:13   #1
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию Создание запроса MO Access

Доброго времени суток.
Задание следующее:
11. Для каждого поставщика определить общее количество наименований поставляемых товаров.

Я не понимаю только 1 вещь.
У меня 2 поставщика поставляют один и тот же товар 2 раза, но только по разным ценам.
Всего товаров(с повторяющимися названиями) по поставщикам 14.
Значит уникальных товаров по поставщикам должно быть 12.
Запрос 1
Код:
SELECT Поставщик.Название_поставщика, Товар.Название_товара
FROM Товар INNER JOIN (Поставщик INNER JOIN Поставка ON Поставщик.Номер_поставщика = Поставка.Номер_поставщика) ON Товар.Номер_товара = Поставка.Номер_товара
GROUP BY Поставщик.Название_поставщика, Товар.Название_товара;
Значит он мне выдаёт поставщиков и наименование товаров. Я посчитал, что запрос мне выдал 12 уникальных товаров по поставщикам.
Окей, подумал я. Значит решение по поставленной задаче, должно выглядеть так:
Запрос 2
Код:
SELECT Поставщик.Название_поставщика, Count(Товар.Название_товара) AS [Количество]
FROM Товар INNER JOIN (Поставщик INNER JOIN Поставка ON Поставщик.Номер_поставщика = Поставка.Номер_поставщика) ON Товар.Номер_товара = Поставка.Номер_товара
GROUP BY Поставщик.Название_поставщика;
Опять таки посчитал, общее количество в столбце [Количество] = 14.
Ну почему 14? Почему в 1 запросе оно выдало 12?
Как это решить?
*уникальных, значит у каждого поставщика одно и то же название товара не будет повторяться.
Artsiom вне форума Ответить с цитированием
Старый 07.06.2015, 17:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT U.Название_поставщика,COUNT(*)
  FROM (

SELECT Поставщик.Название_поставщика, Товар.Название_товара
FROM Товар INNER JOIN (Поставщик INNER JOIN Поставка ON Поставщик.Номер_поставщика = Поставка.Номер_поставщика) ON Товар.Номер_товара = Поставка.Номер_товара
GROUP BY Поставщик.Название_поставщика, Товар.Название_товара

) U
GROUP BY U.Поставщик.Название_поставщика
Только не помню как ACCESS на GROUP BY во вложенном среагирует
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2015, 18:21   #3
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

О Боже... всё работает.
Спасибо, но как?

Как это понять? U.Название_поставщика
"Буква" - это псевдоним, для создания копии обрабатываемой таблицы(фраза из моей методички).

Посмотрел в инете * - это подстановочный знак, а для чего и зачем?

После FROM-а должны идти таблицы от куда мы берём данные. Ну, тут понятно, мы вложенным запросом формируем таблицу из 2-х столбцов:
Код:
GROUP BY Поставщик.Название_поставщика, Товар.Название_товара
Так?

А вот дальше меня клинит ещё больше:
Код:
U
GROUP BY U.Поставщик.Название_поставщика
Ничего не понял.
Artsiom вне форума Ответить с цитированием
Старый 07.06.2015, 18:27   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

U псевдоним таблицы, можно считать что вложенный запрос тоже таблица, только временная или виртуальная, кому как удобней. Псевдоним для удобства, а здесь без него вообще не обойтись. Игры с этим же запросом:
Код:
SELECT U.Название_поставщика,COUNT(*)
  FROM (

SELECT P.Название_поставщика, T.Название_товара
FROM Товар T INNER JOIN (Поставщик P INNER JOIN Поставка P1 ON P.Номер_поставщика = P1.Номер_поставщика) ON T.Номер_товара = P1.Номер_товара
GROUP BY P.Название_поставщика, T.Название_товара

) U
GROUP BY U.Название_поставщика
Цитата:
GROUP BY U.Поставщик.Название_поставщика
И правда работает? То описка, должно GROUP BY U.Название_поставщика
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.06.2015 в 18:31.
Аватар вне форума Ответить с цитированием
Старый 07.06.2015, 18:38   #5
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Ага, вроде с большего понятно.
Но почему тогда мой 1 запрос выдал 12 уникальных, а 2-й просто 14?
Этого не понимаю. Я же не где не использовал DISTINCT для исключения повторяющихся записей. Даже если бы и написал - он не хочет работать.

Цитата:
Сообщение от Аватар Посмотреть сообщение
И правда работает? То описка, должно GROUP BY U.Название_поставщика
Да, работает.

Последний раз редактировалось Аватар; 07.06.2015 в 18:42.
Artsiom вне форума Ответить с цитированием
Старый 07.06.2015, 18:41   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В первом запросе - GROUP BY Поставщик.Название_поставщика, Товар.Название_товара
Во втором - GROUP BY Поставщик.Название_поставщика

Разница ощутимая
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2015, 18:48   #7
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

GROUP BY объединяет уже после того как таблица со столбцами
Код:
Поставщик.Название_поставщика, Count(Товар.Название_товара) AS [Количество]
будет создана???
Artsiom вне форума Ответить с цитированием
Старый 07.06.2015, 18:55   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
GROUP BY объединяет уже после того как таблица со столбцами
Угу, вот туда и попали 14 записей. Count(Товар.Название_товара) AS [Количество] - а чего должно быть 12, если записей 14? Count(Товар.Название_товара) считает все строки, у которых Название_товара<>NULL, даже если они совпадают. Count(*) считает все строки без анализа на NULL чего либо.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2015, 19:01   #9
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Ага.
Спасибо))
Artsiom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access 2003. Создание запроса. Niro Помощь студентам 4 23.09.2014 00:18
Ошибка запроса access ЕвгенРад БД в Delphi 1 29.05.2013 02:47
Создание запроса к БД в Access Urbic Microsoft Office Access 7 26.03.2013 03:55
Access создание запроса и таблички Evgen_31 Microsoft Office Access 1 29.06.2009 16:49
Запуск запроса из БД Access через С# AnnNet Общие вопросы .NET 1 20.05.2009 16:31