Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачка по sql 
:(
    Опции темы
moriturus
Дата 18.2.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Да, это задачка с sql-ex
но я всю голову сломал  smile , что не так . не надо за меня решать, просто намекните куда копать
Схема БД состоит из четырех отношений:
Задачко:
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 - принтер). Предполагается, что номера моделей уникальны для всех производителей и типов продуктов. В отношении PC для каждого номера модели, обозначающего ПК, указаны скорость -speed (процессора в мегагерцах), общий объем RAM (в мегабайтах), размер диска -hd (в гигабайтах), скорость считывающего устройства CD (например, 4х) и цена - price. Отношение Laptop аналогично отношению РС за исключением того, что вместо скорости CD содержится размер экрана -screen (в дюймах). В отношении Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный - Laser, струйный - Jet или матричный - Matrix) и цена.

Задание: 14
Для таблицы Product получить результирующий набор в виде таблицы со столбцами maker, pc, laptop и printer, в которой для каждого производителя требуется указать, производит он (yes) или нет (no) соответствующий тип продукции.
В первом случае (yes) указать в скобках без пробела количество имеющихся в наличии (т.е. находящихся в таблицах PC, Laptop и Printer) различных по номерам моделей соответствующего типа.


Написал вот это, типо правильно на 1 базе, а на другоц нет
мое решение; 
Код

SELECT product.maker , (select 
case when COUNT(DISTINCT pc.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT pc.model))) +')' end
   FROM product pr,pc where pr.model=pc.model and product.maker = pr.maker) pc,

(select case when COUNT(DISTINCT laptop.model)=0
 then 'no' else 'yes('+ rtrim(convert(char(20),COUNT(DISTINCT laptop.model)))+')'  end
   FROM product pr, laptop where  pr.model=laptop.model 
  and product.maker = pr.maker) laptop,

(select case when COUNT(DISTINCT printer.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT printer.model)))+')' end
   FROM product pr ,printer where pr.model=printer.model 
  and product.maker = pr.maker ) printer

from product
group by product.maker



Спасибо всем кто поможет

Добавлено через 3 минуты и 25 секунд
з.ы. к этой задачке там есть подсказка, но я ее сразу учел
PM MAIL   Вверх
Deniz
Дата 19.2.2008, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Так бывает, на вид вроде правильно, но ...
У меня решение немного другое:
Код

select p.maker,
(
case when exists(...) then 'yes(' + cast(count(distinct pc.model) as varchar(10)) + ')' else 'no' end
) as pc,
...
from product p
  left join pc on p.model = pc.model
...
group by p.maker




--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
moriturus
Дата 19.2.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Спасибо большое.  Но так вообще неправильно выходит  даже на основной базе 
когда так: 
Код

from product p
  left join pc on p.model = pc.model
...

вообще ответы неверные
если не сойдет за выклянчивание полного решения - то что вот здесь? 
Код

case when exists(?) 

собственно как проверку строите?
PM MAIL   Вверх
Kangaroo
Дата 19.2.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: нет
Всего: 104



moriturus
проверку нужно делать по табличке Product. Там в ФАКе написано, что может быть вариант yes(0), то есть производитель делает компьютеры, но в данный момент на складе этой модели нету (то есть этой модели нету в табличке ПС)
Я как-то так проверял:
Код

case when 
  (
    select count(*)
    from Product p1
    where p1.type = 'PC'
   ) = 0
then ... 



--------------------
Lost....
PM MAIL MSN   Вверх
moriturus
Дата 19.2.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Цитата(Kangaroo @ 19.2.2008,  13:51)

проверку нужно делать по табличке Product. Там в ФАКе написано, что может быть вариант yes(0), то есть производитель делает компьютеры, но в данный момент на складе этой модели нету (то есть этой модели нету в табличке ПС)

так если такая проверка, то как раз и смотрит производят ли вообще
сделал и так 
Код

SELECT product.maker , (select 
case when ((select count(distinct p1.model) from Product p1 where p1.type = 'PC') = 0 or COUNT(DISTINCT pc.model)=0)
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT pc.model))) +')' end
   FROM product pr,pc where pr.model=pc.model and product.maker = pr.maker) pc,
(select case when ((select count(distinct p2.model) from Product p2 where p2.type = 'laptop') = 0 or COUNT(DISTINCT laptop.model)=0)
 then 'no' else 'yes('+ rtrim(convert(char(20),COUNT(DISTINCT laptop.model)))+')'  end
   FROM product pr, laptop where  pr.model=laptop.model 
  and product.maker = pr.maker) laptop,
(select case when ((select count(distinct p3.model) from Product p3 where p3.type = 'printer') = 0 or COUNT(DISTINCT printer.model)=0)
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT printer.model)))+')' end
   FROM product pr ,printer where pr.model=printer.model 
  and product.maker = pr.maker ) printer
from product
group by product.maker

тот же результат
если убрать 
Код

or COUNT(DISTINCT pc.model)=0
 то как раз yes(0) будет - я сразу фак прочитал и там именно  модели надо искать. то есть наличие
faq 14
PM MAIL   Вверх
Deniz
Дата 19.2.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



moriturus, тебя не поймешь  smile, то
Цитата(moriturus @  18.2.2008,  19:39 Найти цитируемый пост)
не надо за меня решать, просто намекните куда копать

а то
Цитата(moriturus @  19.2.2008,  16:43 Найти цитируемый пост)
если не сойдет за выклянчивание полного решения 

повторю Kangaroo смотри внимательно может быть вариант yes(0).

Я предложил exists потому что он более понятно подходит в данном вопросе, 
т.е. существует запись для производителя А и с типом  'pc'.

Добавлено через 1 минуту и 40 секунд
moriturus, так ты решил или нет?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
moriturus
Дата 19.2.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



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

Добавлено через 1 минуту и 46 секунд
нет, я не решил
с exists  тоже самое - правильно на основной - неправильно на тестовой

PM MAIL   Вверх
Deniz
Дата 19.2.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(moriturus @  19.2.2008,  17:29 Найти цитируемый пост)
у меня какая-то принципиальная ошибка в запросе
именно.
вот почему
Код

(select ... FROM product pr,pc where pr.model=pc.model and product.maker = pr.maker) pc

CASE опустил он сейчас не играет роли, так вот если производитель производит 'pc', 
то в таблице продукт есть запись производитель-'A', модель-'12345', type-'pc', но если у него нет моделей на складе (в таблице PC), то такой запрос что должен вернуть? У меня в запросе есть left join как раз для этого. Переделай свой последний запрос на
Код
select ... from product pr left join pc on pr.model = pc.model
и будет тебе счастье  smile 

PS:
Цитата(moriturus @  19.2.2008,  17:29 Найти цитируемый пост)
если ты проверку другую делаешь. то какую? - словами, а не кодом - раз волнуешься
не волнуюсь ни капельки, если хочешь выложу сюда правильный код примерно похожий на твой? Только мы же не для кого-то стараемся, а свои силы пробуем.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Kangaroo
Дата 19.2.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: нет
Всего: 104



moriturus
чуть изменил твой запрос и прошло проверку )
Подсказка.
Нужно изменить эти условия:
Код

(select count(distinct p1.model) from Product p1 where p1.type = 'PC') = 0 or COUNT(DISTINCT pc.model)=0


Попробуй, если что - выложу решение.

Это сообщение отредактировал(а) Kangaroo - 19.2.2008, 15:11


--------------------
Lost....
PM MAIL MSN   Вверх
moriturus
Дата 20.2.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



неа... но не выкладывайте пока. я что-то туплю, но сам сделаю

Это сообщение отредактировал(а) moriturus - 20.2.2008, 10:41
PM MAIL   Вверх
moriturus
Дата 20.2.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Код

SELECT product.maker , (select 
case when COUNT(DISTINCT pc.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT pc.model))) +')' end
  from product pr left join pc on pr.model = pc.model where product.maker = pr.maker) pc,
(select case when COUNT(DISTINCT laptop.model)=0
 then 'no' else 'yes('+ rtrim(convert(char(20),COUNT(DISTINCT laptop.model)))+')'  end
   from product pr left join laptop on pr.model = laptop.model
  where product.maker = pr.maker) laptop,
(select case when COUNT(DISTINCT printer.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT printer.model)))+')' end
   from product pr left join printer on pr.model = printer.model
  where product.maker = pr.maker ) printer
from product
group by product.maker

Deniz. Заменил - то же самое  smile

Добавлено через 7 минут и 28 секунд
Kangaroo7 - спасибо. Я давно понял, что дело именно в этом условии...
PM MAIL   Вверх
moriturus
Дата 20.2.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Притом я не понимаю, если ошибка именно в том, что я не учитываю возможность отсутствия наличия. то почему по производителю Е все пучком, в основной базе именно по нему 3 модели в продакт, а в пк только 1, и мой запрос правильно по нему данные показывает...
PM MAIL   Вверх
Deniz
Дата 20.2.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(moriturus @  20.2.2008,  13:51 Найти цитируемый пост)
Deniz. Заменил - то же самое

moriturus, ну давай по порядку. Разберем запрос на примере PC.
Код

select 
case when COUNT(DISTINCT pc.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT pc.model))) +')' end
  from product pr left join pc on pr.model = pc.model where product.maker = pr.maker

left join хорошо, т.е. в запрос попадут записи из product у которых pr.model = pc.model.
Далее если нет модели в PC, то что будет для условия pr.model = pc.model? Попадут все производители, независимо от того, производят они PC или нет. Как их отсечь? добавить доп. ограничение в where.
Далее чем отличается case when COUNT(DISTINCT pc.model)=0 и case when COUNT(DISTINCT pr.model)=0 для результата?
ответ, считаем кол-во моделей для таблицы PC и для Product. При условии что они есть на складе результат одинаковый, а если их на складе нет?
Все.
Твой последний запрос с небольшими изменениями дает правильный результат.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
moriturus
Дата 20.2.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



я сдаюсь. я дурак
если вместо left join использовать inner, то сразу будут только те какие в наличии - то есть только если pr.model = pc.model и при count(pc.model) тоже только то,что есть
а зачем left join и условие where дополнительные  - я не допираю

если делать так
Код

FROM product pr,pc where pr.model=pc.model

то если модели нет в пс то она и не попадет в запрос...

Это сообщение отредактировал(а) moriturus - 20.2.2008, 13:06
PM MAIL   Вверх
Deniz
Дата 20.2.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Твой запрос подправил так:
Код

select 
case when COUNT(DISTINCT pr.model)=0 
then 'no' else 'yes('+rtrim(convert(char(20),COUNT(DISTINCT pc.model))) +')' end
  from product pr left join pc on pr.model = pc.model where product.maker = pr.maker and pr.type = 'pc'
далее по аналогии

Рассказываю
в case when проверить работает ли поставщик с PC
Код
exists(select 1 from product pr where pr.type = 'pc' and pr.maker = product.maker)
или
Код
(select count(*) from product pr where pr.type = 'pc' and pr.maker = product.maker) >0
кому как нравится
и уже потом получаешь 'yes(0,1,2,3)' или 'no' и т.д.

PS: что-то www.sql-ex.ru не отвечает. Долго бился над 41 задачей(решил), мозги заворачиваются.  smile 
PSS:
... product pr left join pc on pr.model=pc.model ...
Left делает выборку всех записей с левой таблицы(в данном случае product) и только тех записей с правой(у нас PC) для которых выполняется условие после on т.е. pr.model=pc.model, если записей нет в выбираемые поля подставляется null.
Запусти простой select типа 
Код
select pr.*, pc.* from product pr left join pc on pr.model=pc.model
 и сравни результаты для left join и inner join.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

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

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1024 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.