Автор Тема: Вопрос по SQL, начинающего уровня  (Прочитано 5046 раз)

Оффлайн benassi

  • Модератор
  • Постоялец
  • *****
  • Сообщений: 476
  • Карма: +51/-0
    • Просмотр профиля
Вопрос по SQL, начинающего уровня
« : 25 Февраля 2015, 21:54:47 »
Приветствую) Уважаемые однофорумчане знающие SQL , прошу вашей помощи!
Начал по-тихоньку осваивать SQL  в свободное время (сильно не судить :police:) и вот застрял на каком вопросе, кто знает помогите разобраться. Заранее благодарен.
Схема БД состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, price, screen)
Printer(code, model, color, type, price)
Нужно вывести модели(model) и цены(price) от производителя(maker) 'B'

Пишу для этого следующий запрос:

SELECT DISTINCT Product.model,PC.price AS Cena_PC,Laptop.price AS Cena_LP, Printer.price AS Cena_PR FROM Product
FULL OUTER JOIN PC ON PC.model = Product.model
FULL OUTER JOIN Laptop ON Laptop.model = Product.model
FULL OUTER JOIN Printer ON Printer.model = Product.model
WHERE maker='B'


Выводит он информацию:


Вот мне нужно получить такой вид:


Подскажите, как поступить?

Оффлайн ANALGIN2

  • Завсегдатай
  • ****
  • Сообщений: 747
  • Карма: +48/-0
  • Геморой - игра, стоящая свеч.
    • Просмотр профиля
Re: Вопрос по SQL, начинающего уровня
« Ответ #1 : 25 Февраля 2015, 22:43:32 »
Честно признаюсь, что sql даже не щупал ни разу, поэтому не уверен, что это возможно сделать его (её?) средствами. А вот простенькую предобработку на php - легко. Берутся все значения из Cena_* и если значение не равно Null , записывается в Cena (конечно, при условии, что неNull только одно в строке model).

Оффлайн I-one

  • Завсегдатай
  • ****
  • Сообщений: 972
  • Карма: +84/-0
  • Hi!
    • Просмотр профиля
    • Сокровища в сети! Уникальная онлайн игра где можно заработать.
Re: Вопрос по SQL, начинающего уровня
« Ответ #2 : 25 Февраля 2015, 22:51:08 »
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
http://sokrovishavseti.ru/ - увлекательная, познавательная онлайн-игра с выводом денег. Присоединяйся!

Оффлайн benassi

  • Модератор
  • Постоялец
  • *****
  • Сообщений: 476
  • Карма: +51/-0
    • Просмотр профиля
Re: Вопрос по SQL, начинающего уровня
« Ответ #3 : 25 Февраля 2015, 23:01:12 »
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
Была такая идея, пробовал через ISNULL заменить на 0, а потом вышеописанным методом,  что-то там не задалось, завтра повнимательней поэкспериментирую.
ANALGIN2, I-one спасибо за проявленный интерес.

Оффлайн Eugene L.

  • Модератор
  • Продвинутый
  • *****
  • Сообщений: 1218
  • Карма: +124/-9
    • Просмотр профиля
    • Ремонт электродвигателей
Re: Вопрос по SQL, начинающего уровня
« Ответ #4 : 25 Февраля 2015, 23:02:50 »
в чем выполняешь запрос?
Может убрать из запроса DISTINCT цену Laptop.price? Может перед сном не понял суть, но смысла в них не вижу
После where условие на NULL и все вроде

Оффлайн Chaek

  • Постоялец
  • ***
  • Сообщений: 240
  • Карма: +45/-0
    • Просмотр профиля
Re: Вопрос по SQL, начинающего уровня
« Ответ #5 : 25 Февраля 2015, 23:09:49 »
Я бы немного свернул
Product(ID,  modelID,  ..., etc)
Model(ID, makerID, price)
Maker (ID, Name)
PC(ID, modelID, speed, ram, hd, cd)
Laptop(ID, modelID, speed, ram, hd, screen)
Printer(ID, modelID, color, type)

то есть свойства общие для сущностей вывести в общую таблицу. много меньше гемароя при добавлении новых типов моделей
« Последнее редактирование: 25 Февраля 2015, 23:17:57 от Chaek »
Народ не должен бояться власти,
Власть должна бояться народа!
© V

Оффлайн benassi

  • Модератор
  • Постоялец
  • *****
  • Сообщений: 476
  • Карма: +51/-0
    • Просмотр профиля
Re: Вопрос по SQL, начинающего уровня
« Ответ #6 : 25 Февраля 2015, 23:19:11 »
в чем выполняешь запрос?
Может убрать из запроса DISTINCT цену Laptop.price? Может перед сном не понял суть, но смысла в них не вижу
После where условие на NULL и все вроде

DISTINCT это я для фильтрации поля model сделал для исключения дубликатов, т.к. есть повторяющиеся строки. (может конечно что-то неправильно по синтаксису оформил)
Да выполняю пока в веб морде с упражнениями по sql, а далее начну на практике использовать T-SQL в MS SQL Server.
Я бы немного свернул
Product(ID,  modelID,  ..., etc)
Model(ID, makerID, price)
Maker (ID, Name)
PC(ID, modelID, speed, ram, hd, cd)
Laptop(ID, modelID, speed, ram, hd, screen)
Printer(ID, modelID, color, type)
Спасибо! правда уже после того как освою азы, направлюсь в сторону рационального использования ресурсов и правильного оформления.
« Последнее редактирование: 25 Февраля 2015, 23:20:44 от benassi »

Оффлайн benassi

  • Модератор
  • Постоялец
  • *****
  • Сообщений: 476
  • Карма: +51/-0
    • Просмотр профиля
Re: Вопрос по SQL, начинающего уровня
« Ответ #7 : 26 Февраля 2015, 09:26:52 »
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
Была такая идея, пробовал через ISNULL заменить на 0, а потом вышеописанным методом,  что-то там не задалось, завтра повнимательней поэкспериментирую.
ANALGIN2, I-one спасибо за проявленный интерес.
Всем спасибо , все решил )
Вот "правильный" код:
SELECT DISTINCT Product.model,
ISNULL(PC.price,0) + ISNULL(Laptop.price,0) + ISNULL(Printer.price,0) AS price
FROM Product
LEFT OUTER JOIN PC ON PC.model = Product.model
LEFT OUTER JOIN Laptop ON Laptop.model = Product.model
LEFT OUTER JOIN Printer ON Printer.model = Product.model
WHERE maker='B'
« Последнее редактирование: 26 Февраля 2015, 09:53:01 от benassi »