Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с запросом / 25 сообщений из 25, страница 1 из 1
16.01.2008, 14:00
    #35065442
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT maker as m, (select 
case when COUNT(DISTINCT pc.model)= 0  
then 'no' else COUNT(DISTINCT pc.model)  end
   FROM product pr 
   JOIN pc ON pr.model=pc.model 
  WHERE maker = m ) pc,

(select case when COUNT(DISTINCT laptop.model)= 0 
 then 'no' else COUNT(DISTINCT laptop.model)  end
   FROM product pr 
   JOIN laptop ON pr.model=laptop.model 
  WHERE maker = m ) laptop,

(select case when COUNT(DISTINCT printer.model)= 0  
then 'no' else COUNT(DISTINCT printer.model) end
   FROM product pr 
   JOIN printer ON pr.model=printer.model 
  WHERE maker = m ) printer

from product
group by maker 

на локальном компьютере этот запрос работает, а на другом почему то ругаеться, Invalid column name 'm'.
Помогите, плз!
...
Рейтинг: 0 / 0
16.01.2008, 14:15
    #35065498
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
версии MySQL в обоих случаях?
...
Рейтинг: 0 / 0
16.01.2008, 15:32
    #35065793
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Я нее знаю... вообще-то это тестовое задание с www.sql-ex.ru. А я не знаю какая там версия
...
Рейтинг: 0 / 0
16.01.2008, 15:34
    #35065802
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
тогда аккуратно перепишите запрос с алиасами таблиц и с явным указанием таблиц (или их алиасов) для каждого из упоминаемых полей.
...
Рейтинг: 0 / 0
16.01.2008, 15:39
    #35065813
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Что-то я не понимаю... Где аккуратно прописать? Там вроде все аккуратно
...
Рейтинг: 0 / 0
16.01.2008, 15:44
    #35065837
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT t.maker as m, (select 
case when COUNT(DISTINCT pc.model)= 0  
then 'no' else COUNT(DISTINCT pc.model)  end
   FROM product pr 
   JOIN pc ON pr.model=pc.model 
  WHERE pr.maker = t.maker ) pc,

(select case when COUNT(DISTINCT laptop.model)= 0 
 then 'no' else COUNT(DISTINCT laptop.model)  end
   FROM product pr 
   JOIN laptop ON pr.model=laptop.model 
  WHERE pr.maker = t.maker  ) laptop,

(select case when COUNT(DISTINCT printer.model)= 0  
then 'no' else COUNT(DISTINCT printer.model) end
   FROM product pr 
   JOIN printer ON pr.model=printer.model 
  WHERE pr.maker = t.maker  ) printer

from product t
group by t.maker 
Примерно так.
Вообще в сложных запросах, имхо, поля без явного указания таблицы лучше не использовать, т.к. слишком легко налететь на ошибку.
...
Рейтинг: 0 / 0
16.01.2008, 15:48
    #35065846
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Прописала, не помогло...
А может есть какой-нить другой вариант доступа к определенной строке?
...
Рейтинг: 0 / 0
16.01.2008, 15:51
    #35065853
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
imladrisПрописала, не помогло...Как именно не помогло?
imladrisА может есть какой-нить другой вариант доступа к определенной строке?Что-то ваш запрос не похож на "вариант доступа к определенной строке". Или это уже отдельный вопрос?
...
Рейтинг: 0 / 0
16.01.2008, 15:51
    #35065855
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Ой, извините.... сейчас уже работает.. спасибо!
...
Рейтинг: 0 / 0
16.01.2008, 16:40
    #35066051
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Уважаемый, miksoft. А не моргли бы Вы мне подсказать как еще можно более оптимизировать запрос, а то на сайте выдаеться сообщение: Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе.
...
Рейтинг: 0 / 0
16.01.2008, 17:18
    #35066220
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT product.maker as m,
CASE WHEN COUNT(DISTINCT pc.model)= 0  THEN 'no' ELSE COUNT(DISTINCT pc.model) END pc,
CASE WHEN COUNT(DISTINCT laptop.model)= 0  THEN 'no' ELSE COUNT(DISTINCT laptop.model)  END laptop,
CASE WHEN COUNT(DISTINCT printer.model)= 0  THEN 'no' ELSE COUNT(DISTINCT printer.model) END printer,
FROM product
LEFT JOIN pc ON product.model=pc.model
LEFT JOIN laptop ON product.model=laptop.model
LEFT JOIN printer ON product.model=printer.model
GROUP BY product.maker
Вроде так, если не наврал...
...
Рейтинг: 0 / 0
16.01.2008, 17:58
    #35066406
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Спасибо огромное!!! :)
Но опять не работает
...
Рейтинг: 0 / 0
16.01.2008, 17:59
    #35066414
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Т.е. неправильный результат на проверочной БД.
...
Рейтинг: 0 / 0
16.01.2008, 18:01
    #35066425
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Какой-то загадочный скрипт!!
...
Рейтинг: 0 / 0
16.01.2008, 18:07
    #35066456
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Тогда давайте исходное задание сюда.
Хотя публичное решение задач с www.sql-ex.ru на нашем сайте не приветствуется.
...
Рейтинг: 0 / 0
16.01.2008, 18:09
    #35066465
imladris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Но оно очень странное... если бы не такое тупое задание, я бы не обращалась...
Вобщем так:
Отношение Product представляет производителя (maker), номер модели (model) и тип (PC - ПК, Laptop - ПК-блокнот или Printer - принтер). Предполагается, что номера моделей уникальны для всех производителей и типов продуктов. В отношении PC для каждого номера модели, обозначающего ПК, указаны скорость -speed (процессора в мегагерцах), общий объем RAM (в мегабайтах), размер диска -hd (в гигабайтах), скорость считывающего устройства CD (например, 4х) и цена - price. Отношение Laptop аналогично отношению РС за исключением того, что вместо скорости CD содержится размер экрана -screen (в дюймах). В отношении Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный - Laser, струйный - Jet или матричный - Matrix) и цена.


Для таблицы Product получить результирующий набор в виде таблицы со столбцами maker, pc, laptop и printer, в которой для каждого производителя требуется указать, производит он (yes) или нет (no) соответствующий тип продукции.
В первом случае (yes) указать в скобках без пробела количество имеющихся в наличии (т.е. находящихся в таблицах PC, Laptop и Printer) различных по номерам моделей соответствующего типа.
...
Рейтинг: 0 / 0
02.02.2008, 19:53
    #35106151
GlooBus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
imladrisНо оно очень странное... если бы не такое тупое задание, я бы не обращалась...

Присоединяюсь, самому интересно как же это решается на уровне мускула, т.к. используя свой оракл я данное задание решил без проблем
...
Рейтинг: 0 / 0
18.02.2008, 16:30
    #35139620
MartKot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Аналогично - засел на этой задачке, на сайте подсказка к ней ничего не дает. всю голову сломал - не пойму что не так. Хоть какую-нибудь наводку
...
Рейтинг: 0 / 0
12.03.2008, 14:01
    #35185076
winter2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
верно будет так:,только с 'yes' нужно еще подумать

select product.maker,
case when count(distinct pc.model) = 0 then 'no' else cast( count(distinct pc.model) as char(20)) end,

case when count(distinct laptop.model) = 0 then 'no' else cast( count(distinct laptop.model) as char(20)) end ,

case when count(distinct printer.model) = 0 then 'no' else cast( count(distinct printer.model) as char(20)) end


from product
left join pc on product.model = pc.model
left join laptop on product.model = laptop.model
left join printer on product.model = printer.model
group by product.maker
...
Рейтинг: 0 / 0
12.04.2008, 16:54
    #35251445
dante77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
помогаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select t.maker,
case when pc =  0  and t.maker not in (select maker from product where type = 'pc') then 'no' else 'yes('+pc+')' end pc, 
case when laptop =  0  and t.maker not in (select maker from product where type = 'laptop') then 'no' else 'yes('+laptop+')' end laptop, 
case when printer =  0  and t.maker not in (select maker from product where type = 'printer') then 'no' else 'yes('+printer+')' end printer
from (
select maker, cast(count(distinct q.model) as varchar(max)) pc
from product p left join pc q on p.model = q.model
group by maker) t
join (
select maker, cast(count(distinct q.model) as varchar(max)) laptop
from product p left join laptop q on p.model = q.model
group by maker) tt on t.maker = tt.maker
join (
select maker, cast(count(distinct q.model) as varchar(max)) printer
from product p left join printer q on p.model = q.model
group by maker) ttt
on t.maker = ttt.maker
...
Рейтинг: 0 / 0
12.04.2008, 16:59
    #35251447
dante77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
GlooBus imladrisНо оно очень странное... если бы не такое тупое задание, я бы не обращалась...

Присоединяюсь, самому интересно как же это решается на уровне мускула, т.к. используя свой оракл я данное задание решил без проблем
в данном конкретном случае выбор СУБД ИМХО никак не влияет на результат
...
Рейтинг: 0 / 0
30.12.2008, 11:23
    #35741119
genixxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
я канеш все понимаю, что решать нужно самому и т.п., но очень неудобно понять в чем ошибка, когда запрос выполняется на втором тесте и даже неясно как решать проблему. Понятно, что так было сделано для защиты от подстановки значений, но вот я сейчас вообще не знаю что именно изменить чтоб заработало.
Посмотрите, пожалуйста, кто решил задачу - в чем проблема? Почему он не проходит на другом тесте, ведь вроде все должно быть нормально...

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT DISTINCT 
   maker,
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM pc b, product c WHERE b.model=c.model AND c.type='pc' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no'),
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM laptop b, product c WHERE b.model=c.model AND c.type='laptop' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no'),
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM printer b, product c WHERE b.model=c.model AND c.type='printer' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no')

FROM product a
...
Рейтинг: 0 / 0
30.12.2008, 21:36
    #35742165
genixxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Ладно, не парьтесь, уже нашел в чем проблема. Надо выводить yes не только для тех, товары которых есть в наличии, но и для которых они существуют, но на данный момент нет в наличии. Поэтому мой способ с реплейсом без кейса не прокатит.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.07.2020, 18:46
    #39976783
Metaphor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
genixxx,

B твоем запросе ошибка, ввиду того, что по условию задачи yes(0) не равен no, поэтому более правильно добавить проверку через case:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select distinct a.maker
      ,case when a.maker in (select Pr.maker from Product as Pr Left join PC PC_a on Pr.model = PC_a.model where Pr.type = 'PC')                                  -- Проверяется условие по нахождению PC производителя - maker в  таблице Product 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM pc b, product c WHERE b.model=c.model AND c.type='pc' AND c.maker=a.maker) AS VARCHAR) + ')' -- В случае положительного ответа в строке выше, выводится значение количества уникальных строк
            else 'no' END as PC                                                                                                                                   -- В случае отрицательного ответа выводится no                                                             

      ,case when a.maker in (select Pr.maker from Product as Pr Left join Laptop LP_a on Pr.model = LP_a.model where Pr.type = 'laptop') 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM laptop b, product c WHERE b.model=c.model AND c.type='laptop' AND c.maker=a.maker) AS VARCHAR) + ')'
            else 'no' END as Laptop

      ,case when a.maker in (select Pr.maker from Product as Pr Left join Printer Print_a on Pr.model = Print_a.model where Pr.type = 'Printer') 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM printer b, product c WHERE b.model=c.model AND c.type='Printer' AND c.maker=a.maker) AS VARCHAR) + ')'
            else 'no' END as Printer

from Product a 
...
Рейтинг: 0 / 0
06.07.2020, 19:30
    #39976800
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с запросом
Metaphor
Код: plsql
1.
select Pr.maker from Product as Pr Left join PC PC_a on Pr.model = PC_a.model where Pr.type = 'PC'

А зачем тут таблица PC ?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с запросом / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]