Гуру SQL АУ-У-У!!! Сдаюсь((((

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
SQL-EX, задача 56, сложность 3, мое предполагаемое решение:
select class,sum(Sunks) as Sunks
from
(select Classes.class as class,
(select count(Outcomes.ship) from Outcomes where (
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk') as Sunks
from Classes left outer join Ships on Classes.class=Ships.class) as zapros
group by class
Основная база тетст пройден, на второй 2-насовпадения
Кто нить скажите, где я тут дибил? Только не надо решения, просто тыкнете носом где не прав. Если ни кто не подскажет, то мой мозг разорвет и будет очень грязно.
 

mazx

New member
Регистрация
5 Мар 2008
Сообщения
24
Реакции
0
Баллы
0
ничего не ясно ..что за тест что за хрень о чем ты вообще :)
ты похоже думаешь что тут телепаты ) не дал ни таблицы откуда выборка ничего вообще я бы на твоем месте попробовал Outcomes.result like 'sunk'
хз есть ли в sql-ex но для обычного подходит
 

ronin

Member
Регистрация
9 Авг 2009
Сообщения
222
Реакции
0
Баллы
16
Адрес
Северодвинск
SQL-EX это сайт :) только я не понял как там найти 56 задачу, а так действительно ничего не понятно
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
может так
SELECT class, count(*) as bul_bul
from
(
select class=
isnull( (select class from Ships where Ships.name=Outcomes.ship),
(select class from Classes where Ships.class=Outcomes.ship)
)
from Outcomes where result = 'sunk'
) as uvi
GROUP BY class
 

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
может так
SELECT class, count(*) as bul_bul
from
(
select class=
isnull( (select class from Ships where Ships.name=Outcomes.ship),
(select class from Classes where Ships.class=Outcomes.ship)
)
from Outcomes where result = 'sunk'
) as uvi
GROUP BY class
Данный подзапрос неверен. В нет ни в джоинах таблицы Ships, ни в основном запросе.

ничего не ясно ..что за тест что за хрень о чем ты вообще :)
ты похоже думаешь что тут телепаты ) не дал ни таблицы откуда выборка ничего вообще я бы на твоем месте попробовал Outcomes.result like 'sunk'
хз есть ли в sql-ex но для обычного подходит
нет, не то, смысл сложности задачи не в этом


SQL-EX это сайт :) только я не понял как там найти 56 задачу, а так действительно ничего не понятно
нужно перейти в раздел обучающего этапа и там есть выбор задачи.
 
Последнее редактирование:

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
Цитата:Сообщение от nvv13
может так
SELECT class, count(*) as bul_bul
from
(
select class=
isnull( (select class from Ships where Ships.name=Outcomes.ship),
(select class from Classes where Ships.class=Outcomes.ship)
)
from Outcomes where result = 'sunk'
) as uvi
GROUP BY class

Данный подзапрос неверен. В нет ни в джоинах таблицы Ships, ни в основном запросе.

а зачем join? это обязательное условие в задании, наличия join?
а что выдает тест выполнения запроса?
проверь пожалуйста на базе, а то у меня к ней доступа нет, Я не зарегестрирован на SQL-EX, очень хочется знать в чем Я не прав
 
Последнее редактирование:

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
а зачем join? это обязательное условие в задании, наличия join?
а что выдает тест выполнения запроса?
Нет, но в твоем запросе нет этой таблицы вообще, он просто не видит это поле. Вот это выдает при тесте твоего запроса: The multi-part identifier "Ships.class" could not be bound
Вот база:
Краткая информация о базе данных "Корабли":

Рассматривается БД кораблей, участвовавших во второй мировой войне. Имеются следующие отношения:
Classes (class, type, country, numGuns, bore, displacement)
Ships (name, class, launched)
Battles (name, date)
Outcomes (ship, battle, result)
Корабли в «классах» построены по одному и тому же проекту, и классу присваивается либо имя первого корабля, построенного по данному проекту, либо названию класса дается имя проекта, которое не совпадает ни с одним из кораблей. Корабль, давший название классу, называется головным.
Отношение Classes содержит имя класса, тип (bb для боевого (линейного) корабля или bc для боевого крейсера), страну, в которой построен корабль, число главных орудий, калибр орудий (диаметр ствола орудия в дюймах) и водоизмещение ( вес в тоннах). В отношении Ships записаны название корабля, имя его класса и год спуска на воду. В отношение Battles включены название и дата битвы, в которой участвовали корабли, а в отношении Outcomes – результат участия данного корабля в битве (потоплен-sunk, поврежден - damaged или невредим - OK). Замечание. В отношение Outcomes могут входить корабли, отсутствующие в отношении Ships.
Задача:
Для каждого класса определите число кораблей этого класса, потопленных в сражении. Вывести: класс и число потопленных кораблей.
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
понял, опечатка!
SELECT class, count(*) as bul_bul
from
(
select class=
isnull( (select class from Ships where Ships.name=Outcomes.ship),
(select class from Classes where Classes.class=Outcomes.ship)
)
from Outcomes where result = 'sunk'
) as uvi
GROUP BY class

проверь
 

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
Результаты выполнения
Вашего запроса:
class bul_bul
NULL 4
Bismarck 1
Kongo 1
правильного запроса:
class Sunks
Bismarck 1
Iowa 0
Kongo 1
North Carolina 0
Renown 0
Revenge 0
Tennessee 0
Yamato 0
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
а такое
SELECT class, sum(cl) as bul_bul
from
(
select class,cl
from (
select class=isnull( (select class from Ships where Ships.name=Outcomes.ship) ,
(select class from Classes where Classes.class=Outcomes.ship) )
,cl=1
from Outcomes where result = 'sunk'
) as d1 where class is not null
union all
select class,cl=0 from Classes
) as uvi
GROUP BY class
 

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
Теперь верно. А почему мой не совсем корректно работает, я чего то ни как не врубаюсь? Я в роде тоже совпадения нулами разделил, но почему??
 
Последнее редактирование:

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
Теперь верно. А почему мой не совсем корректно работает, я чего то ни как не врубаюсь? Я в роде тоже совпадения нулами разделил, но почему??

а какой результат выдает
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
наверно, один и тот-же класс, несколько раз встречаеться в ship, и всё это суммируеться


соединение
from Classes left outer join Ships on Classes.class=Ships.class

условие счёта
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)

это надо по содержимым табличек проверить
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
достаем внутренний подзапрос
сколько раз один и тот же класс встретиться?
select Classes.class as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
order by Classes.class
 

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
В том то и дело, что результатов второй базы не видно, на первой базе, такой же что и твой результат, а ответ от второй базы мы получаем только в виде количества несовпадений.
Но вс равно ошибки понять не могу? Если он встретился в шипс - его надо про суммировать при условии, что он в Outcomes есть как потопленный. Так и идет сумма по классу. Я уже весь запутался. В чем вся и сложность, что не видишь результатов второй базы...
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
внутренний подзапрос можно ещё под, переделать в :
select class,Sunks=max(Sunks) from
(select Classes.class as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg
group by class

итого, можно попробовать так:
select class,sum(Sunks) as Sunks
from
(
select class,Sunks=max(Sunks) from
(select Classes.class as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg
group by class
) as zapros
group by class
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
В том то и дело, что результатов второй базы не видно, на первой базе, такой же что и твой результат, а ответ от второй базы мы получаем только в виде количества несовпадений.
Но вс равно ошибки понять не могу? Если он встретился в шипс - его надо про суммировать при условии, что он в Outcomes есть как потопленный. Так и идет сумма по классу. Я уже весь запутался. В чем вся и сложность, что не видишь результатов второй базы...

аа, какие они хитрые...
 

KLIM

Заблокирован
Регистрация
25 Июн 2009
Сообщения
943
Реакции
1
Баллы
0
Адрес
Архангельск 2 л\з
итого, можно попробовать так:
select class,sum(Sunks) as Sunks
from
(
select class,Sunks=max(Sunks) from
(select Classes.class as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg
group by class
) as zapros
group by class
На первой базе все норм, но на второй несовпадений 4, мой выдавал 2 несовпадения.
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
поменять имя забыли Ships.name IS NULL тогда Classes.class
select class,sum(Sunks) as Sunks
from
(
select class,Sunks=max(Sunks) from
(select case when Ships.name IS NULL
then Classes.class
else Ships.name
end
as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg
group by class
) as zapros
group by class
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
ой, а имя то нужно Ships.class
select class,sum(Sunks) as Sunks
from
(
select class,Sunks=max(Sunks) from
(select case when Ships.name IS NULL
then Classes.class
else Ships.class
end
as class,
(select count(Outcomes.ship) from Outcomes where
(
(Outcomes.ship=Classes.class and Ships.name IS NULL)
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL)
) and Outcomes.result='sunk'
) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg
group by class
) as zapros
group by class
 
Последнее редактирование:
Сверху