Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технологии_Баз_Данных_2020.docx
Скачиваний:
274
Добавлен:
01.07.2020
Размер:
1.01 Mб
Скачать

3. Оптовая база

Минимальный список характеристик:

  • Код товара, название товара, количество на складе, единица измерения, стоимость единицы товара, примечания - описание товара;

  • Номер, адрес, телефон и ФИО поставщика товара, срок поставки и количество товаров в поставке, номер счета.

Один и тот же товар может доставляться несколькими поставщиками и один и тот же поставщик может доставлять несколько видов товаров.

Выборки:

  • Выбрать поставщиков, которые поставляют все товары.

SELECT Поставщики.ФИО, Товары.Название, Sum(Поставки.Количество_товара) AS [Sum-Количество_товара] FROM Поставщики INNER JOIN (Товары INNER JOIN Поставки ON Товары.[Код товара] = Поставки.Товар) ON Поставщики.Номер = Поставки.Поставщик GROUP BY Поставщики.ФИО, Товары.Название;

SELECT Все_товары1.ФИО, Count(Все_товары1.Название) AS [Count-Название] FROM Все_товары1 GROUP BY Все_товары1.ФИО HAVING (((Count(Все_товары1.Название))=(SELECT Count(Название) FROM Товары)));

  • Определить поставщика, который поставляет товар 'коврик для мыши' по самой низкой в среднем цене.

SELECT Avg(Поставки.Цена) AS [Avg-Цена], Поставщики.ФИО FROM Поставщики INNER JOIN (Товары INNER JOIN Поставки ON Товары.[Код товара] = Поставки.Товар) ON Поставщики.Номер = Поставки.Поставщик WHERE (((Товары.Название)="коврик для мыши")) GROUP BY Поставщики.ФИО;

SELECT Min(Коврик1.[Avg-Цена]) AS [Min-Avg-Цена] FROM Коврик1;

SELECT Коврик1.ФИО FROM Коврик1, Коврик2 WHERE (((Коврик1.[Avg-Цена])=[Коврик2]![Min-Avg-Цена]));

  • Вывести названия товаров, цены на которые никогда не повышались.

SELECT Товары.Название FROM Товары INNER JOIN Поставки ON Товары.[Код товара] = Поставки.Товар GROUP BY Товары.Название HAVING (((Max([Поставки].[Цена])-Min([Поставки].[Цена]))<=0));

  • Определить, на сколько единиц возросли поставки товара 'инструмент' в 2001г. по сравнению с предыдущим годом.

SELECT Sum(Поставки.Количество_товара) AS [Sum-Количество_товара], DatePart('yyyy',[Поставки]![Срок_поставки]) AS Год FROM Товары INNER JOIN Поставки ON Товары.[Код товара] = Поставки.Товар WHERE (((Товары.Название)="Инструмент")) GROUP BY DatePart('yyyy',[Поставки]![Срок_поставки]);

Из этого запроса делаем два других – по 2000 и 2001 году

SELECT Инструмент1.[Sum-Количество_товара], Инструмент1.Год FROM Инструмент1 WHERE (((Инструмент1.Год)=2000));

И аналогичный по 2001 году (не буду тут приводить). И из двух последних делаем еще один, минусуя из количества 2001 года количество товара в 2000 году

SELECT [Инструмент2001]![Sum-Количество_товара]-[Инструмент2000]![Sum-Количество_товара] AS Разность FROM Инструмент2000, Инструмент2001;

4. Производство

Минимальный список характеристик:

  • Код изделия, название изделия, является ли типовым, примечание - для каких целей предназначено, годовой объем выпуска;

  • код, название, адрес и телефон предприятий, выпускающих изделия;

  • название, тип, единица измерения материала, цена за единицу, отметка об использовании материала в данном изделии;

  • количество материала в спецификации изделия, дата установления спецификации, дата отмены;

  • год выпуска и объем выпуска данного изделия предприятием.

Одно изделие может содержать много типов материалов и один и тот же материал может входить в состав разных изделий.

Выборки:

  • Определить изделие, в которое входит больше всего материалов типа 'цветной металл'.

SELECT Изделия.Название, Sum(Спецификация.Количество) AS [Sum-Количество], Материалы.Тип FROM Спец INNER JOIN (Материалы INNER JOIN (Изделия INNER JOIN Спецификация ON Изделия.Код_изделия = Спецификация.Изделие) ON Материалы.Код_материала = Спецификация.Материал) ON Спец.Код = Спецификация.Спецификация WHERE (((IIf((IsNull([Спец]![Дата_отмены]) Or [Спец]![Дата_отмены]>Date()) And [Спец]![Дата_установки]<Date(),1,0))=1)) GROUP BY Изделия.Название, Материалы.Тип HAVING (((Материалы.Тип)="Цветной металл"));

Группируем по названию изделия и по типу материала, как условие ставим «цветной металл». И, раз уж я связался с датами спецификации, придется проверять все спецификации на даты действия. Количество материалов берется из действующей специализации, то есть дата отмены отсутствует или больше текущей, а дата установки меньше или равна текущей. Точнее, я даже не даты сравниваю, а года. И, если спецификация менялась в течение года, то результат будет неправильный. Повторюсь, это просто пример. Переделать на дату или год с месячного учета несложно. Я просто показываю, как можно учесть некоторые нюансы. Получаем список изделий, в состав которых входят материалы из цветных металлов. В следующем запросе выбираем из этого списка изделием с наибольшим количеством

SELECT Max(ЦветМет1.[Sum-Количество]) AS [Max-Sum-Количество] FROM ЦветМет1;

Третий запрос делаем из первых двух. Выбираем название и сумму и сравниваем сумму с максимальным количеством.

SELECT ЦветМет1.Название, ЦветМет1.[Sum-Количество] FROM ЦветМет1, ЦветМет2 WHERE (((ЦветМет1.[Sum-Количество])=[ЦветМет2]![Max-Sum-Количество]));

  • Вывести список изделий, которые не производились в 2000 г.

SELECT Изделия.Название FROM Изделия WHERE (((Изделия.Код_изделия) Not In (SELECT Изделия.Код_изделия FROM Изделия INNER JOIN Выпуск ON Изделия.Код_изделия = Выпуск.Изделие GROUP BY Изделия.Код_изделия, Выпуск.Год_выпуска HAVING ((Выпуск.Год_выпуска)=2000))));

  • Вывести список изделий, для которых затраты на материалы в 2000 г. снизились по сравнению с предыдущим годом.

Сначала посчитаем затраты за все годы с учетом действовавших на тот момент спецификаций. Я посчитал затраты, как произведение выпуска, количества материала в единице изделия и цены материала. Цена у нас постоянная, поэтому затраты зависят от спецификации и объема выпуска. Если объем выпуска не важен, то его можно убрать.

Условие проверки спецификация, как в предыдущем запросе.

SELECT Изделия.Код_изделия, Выпуск.Год_выпуска, Sum([Выпуск]![Объем_выпуска]*[Спецификация]![Количество]*[Материалы]![Цена]) AS Затраты FROM Спец INNER JOIN (Материалы INNER JOIN ((Изделия INNER JOIN Выпуск ON Изделия.Код_изделия = Выпуск.Изделие) INNER JOIN Спецификация ON Изделия.Код_изделия = Спецификация.Изделие) ON Материалы.Код_материала = Спецификация.Материал) ON Спец.Код = Спецификация.Спецификация WHERE (((IIf([Выпуск]![Год_выпуска] Between DatePart('yyyy',[Спец]![Дата_установки]) And IIf(IsNull([Спец]![Дата_отмены]),DatePart('yyyy',Date()),DatePart('yyyy',[Спец]![Дата_отмены])),1,0))=1)) GROUP BY Изделия.Код_изделия, Выпуск.Год_выпуска;

Затем отбираем выпуск 1999 года

SELECT Затраты2000.Код_изделия, Затраты2000.Год_выпуска, Затраты2000.Затраты FROM Затраты2000 WHERE (((Затраты2000.Год_выпуска)=1999));

И точно так же делаем 2000 год. Последний запрос делаем из двух предыдущих (1999 и 2000 год) и таблицы изделий. Выбираем непустые записи, отнимаем из 1999 года 2000-й и, если сумма положительная, выводим.

SELECT Изделия.Название, Затраты_1999.Затраты, Затраты_2000.Затраты, [Затраты_1999.Затраты]-[Затраты_2000.Затраты] AS [Снижение затрат] FROM (Затраты_1999 INNER JOIN Изделия ON Затраты_1999.Код_изделия = Изделия.Код_изделия) INNER JOIN Затраты_2000 ON Изделия.Код_изделия = Затраты_2000.Код_изделия WHERE (((Затраты_1999.Затраты) Is Not Null) AND ((Затраты_2000.Затраты) Is Not Null) AND (([Затраты_1999.Затраты]-[Затраты_2000.Затраты])>0));

  • Вывести среднемесячный расход материала 'лапша' в 2000 г.

SELECT Выпуск.Год_выпуска, Материалы.Название, Sum(Выпуск.Объем_выпуска) AS [Sum-Объем_выпуска], Avg([Спецификация]![Количество]*[Выпуск]![Объем_выпуска]) AS Расход FROM Спец INNER JOIN (Материалы INNER JOIN ((Изделия INNER JOIN Выпуск ON Изделия.Код_изделия = Выпуск.Изделие) INNER JOIN Спецификация ON Изделия.Код_изделия = Спецификация.Изделие) ON Материалы.Код_материала = Спецификация.Материал) ON Спец.Код = Спецификация.Спецификация WHERE (((IIf([Выпуск]![Год_выпуска] Between DatePart('yyyy',[Спец]![Дата_установки]) And IIf(IsNull([Спец]![Дата_отмены]),DatePart('yyyy',Date()),DatePart('yyyy',[Спец]![Дата_отмены])),1,0))=1)) GROUP BY Выпуск.Год_выпуска, Материалы.Название HAVING (((Выпуск.Год_выпуска)=2000) AND ((Материалы.Название)="Лапша"));