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

KLIM

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

KLIM

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

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
а такое то, не прошло
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
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
ну , еще вариант
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 where class is not null
group by class
) as zapros
group by class
 

KLIM

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

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
ха, а у меня ещё идея
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,
isnull(
(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'
),0) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg where class is not null
group by class
) as zapros
group by class
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
KLIM, как последняя идея?
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,
isnull(
(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'
),0) as Sunks
from Classes left outer join Ships on Classes.class=Ships.class
) as dfg where class is not null
group by class
) as zapros
group by class
 

nvv13

Member
Регистрация
14 Июл 2009
Сообщения
82
Реакции
0
Баллы
6
Адрес
Архангельск
nvv13, ах данные виноваты :lol::lol::lol:
Я не жалуюсь, ты просто так подключилься, что я подумал что ты не в курсе.
ЗЫ. норм явление, када в дочерней табле сиротные записи сидят)
для web базы, наверное да
для бухгалтерии или тарификации, нет, нет!, неприятно по крайней мере
 

nvv13

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

SELECT class, sum(cl) as bul_bul
from
(

/*Идём по таблице Outcomes считая утопленников*/
select class,cl
from (
select class=isnull(

/*берем названия класса из таблички корабликов Ships*/
(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
 
Последнее редактирование:

nvv13

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

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,
isnull(
(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'
),0) as Sunks
from Classes full join Ships on Classes.class=Ships.class
) as dfg where class is not null
group by class
) as zapros
group by class

ну и како'во?
 
Последнее редактирование:

KLIM

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

SELECT class, sum(cl) as bul_bul
from
(

/*Идём по таблице Outcomes считая утопленников*/
select class,cl
from (
select class=isnull(

/*берем названия класса из таблички корабликов Ships*/
(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
Этот то вариант правильный дает результат на обоих базах. А вот мой дает две неверных, чем отличается хз, пратически все тоже самое:
select class,sum(Sunks) as Sunks
from
/*идем по классам*/
(select Classes.class as class,
/*подзапросом вытаскиваем кло-во кораблей*/
(select count(Outcomes.ship) from Outcomes where (
/*условия либо нет в Ships, но есть в Classes*/
(Outcomes.ship=Classes.class and Ships.name IS NULL)
/*условия либо есть Ships, но есть в Classes*/
or
(Outcomes.ship=Ships.name and Ships.name IS NOT NULL )
) and Outcomes.result='sunk') as Sunks
/*левое соединение нам дало нулы отсутствущих в Ships*/
from Classes left outer join Ships on Classes.class=Ships.class) as zapros
group by class
 

nvv13

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

мой вариант, идет по утопленникам и приделывает подзопросом имя класса

а твой идёт по именам класса, и приделывает подзопросом количество утоплинников, а имена через left outer join формируються
что будет:
1) если есть какое-то название класса, в табличке ships, а в табличке Classes его нет

поэтому, ещё вариант
select class,sum(Sunks) as Sunks
from
(select * from
(select case when Ships.name IS NULL
then Classes.class
else Ships.class
end
as class,
isnull(
(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'
),0) as Sunks
from Classes full join Ships on Classes.class=Ships.class
) as dfg where class is not null
) as zapros
group by class

попробуй

или проще:
select class,sum(Sunks) as Sunks
from
(select case when Ships.name IS NULL
then Classes.class
else Ships.class
end
as class,
isnull(
(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'
),0) as Sunks
from Classes full join Ships on Classes.class=Ships.class
) as zapros
group by class
 
Последнее редактирование:
Сверху