Войти

Показать полную графическую версию : [решено] Помогите в освоении SQL, не могу решить учебную задачу


evg64
30-10-2010, 20:56
Добрый день!
Задача такая:
Для каждой группы блокнотов с одинаковым номером модели добавить запись в таблицу PC со следующими характеристиками:
код: минимальный код блокнота в группе +20;
модель: номер модели блокнота +1000;
скорость: максимальная скорость блокнота в группе;
ram: максимальный объем ram блокнота в группе *2;
hd: максимальный объем hd блокнота в группе *2;
cd: значение по умолчанию;
цена: максимальная цена блокнота в группе, уменьшенная в 1,5 раза

Краткая информация о базе данных "Компьютерная фирма":

Схема БД состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)
Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер). Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов. В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price. Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах). В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price.
Никак не могу решить, уже долго над ней сижу. Пробовал гуглить. Помогите плз. По идее, задача одна из первых, так что она не должна быть очень сложной, но...

Delirium
01-11-2010, 00:45
Не вижу самой задачи. Описание вижу, информацию вижу, а вот того, что конкретно необходимо сделать, сделать только посредством SQL или еще как - не вижу. Также не вижу хотя бы начальных попыток сделать задание. Делать все с нуля никто не будет, а вот помочь с неверным запросом, подсказать, куда смотреть - всегда пожалуйста.

evg64
04-11-2010, 15:50
Задача: добавить записи в таблицу PC.
Какие именно, описано в первом посте.

Это нужно сделать в 1 SQL запрос.

Над запросом я просидел долго. Сейчас он такой:

insert into pc
( code, model, speed, ram, hd, cd, price )

select min ( laptop.code ) + 20,
min ( laptop.model ) + 1000,
max ( laptop.speed ) * 2,
max ( laptop.ram ) * 2,
max ( laptop.hd ) * 2,
min ( pc.cd ),
max ( laptop.price ) / 1.5
from laptop, pc
where laptop.model in
(Select model from laptop
group by model
having count(model)>1)
Логика такая:
insert into pc
( code, model, speed, ram, hd, cd, price )
Вставить значения, которые равны:
select min ( laptop.code ) + 20,
min ( laptop.model ) + 1000,
max ( laptop.speed ) * 2,
max ( laptop.ram ) * 2,
max ( laptop.hd ) * 2,
min ( pc.cd ),
max ( laptop.price ) / 1.5
from laptop, pc
Минимальным значениям группы, где:
where laptop.model in
(Select model from laptop
group by model
having count(model)>1)
в каждой группе берутся только модели, которых в таблице Laptop больше одной.

Busla
04-11-2010, 16:42
максимальная скорость блокнота - это пять!

"логика" не соответвует коду.

из insert и select убираем cd - значение по умолчанию на то и "по умолчанию", что его не надо указывать
хитрая конструкция с where здесь не требуется, достаточно указать group by model в основном select'е
агрегатная функция для model не нужна, т.к. в рамках группы model одинаковый
таблица pc в select'е не нужна

в условиях задачи я не увидел, что "группа" не может состоять из одной модели

evg64
05-11-2010, 11:50
Спасибо! Разобрался :up:
Правильный запрос такой:
insert into pc
( code, model, speed, ram, hd, price )

select min ( code ) + 20,
model + 1000,
max ( speed ),
max ( ram ) * 2,
max ( hd ) * 2,
max ( price ) / 1.5
from laptop
group by model




© OSzone.net 2001-2012