powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Inner join да не простой
18 сообщений из 18, страница 1 из 1
Inner join да не простой
    #39771576
N_Reeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять, где я ошибся. Помогите, пожалуйста.
Есть задание "Вывести компании где женатых сотрудников с зарплатой больше 1500 меньше, чем не женатых с зарплатой больше 1500".
Дано две таблицы:

Employee
ID Name Salary Age Status
1 Alex 1000 1,5 Married
2 Nik 2500 5 Single
3 Jed 1500 3 Single
4 Tod 700 1 Married
5 Karl 200 0,5 Married
6 Emily 4000 10 Married
7 Den 5000 7 Single
8 Mark 800 2 Single

Company
Id Company_Name Employee_id
1 Google 7
2 Apple 2
2 Apple 4
2 Apple 3
1 Google 5
3 Samsung 6
1 Google 1
3 Samsung 8

Мой код:

use [Тест]
go
SELECT c.Company_Name
from employee e
inner join company c
on e.ID = c.employee_id
Where ((select count(e.Name) from employee e
where e.status = 'Married'
And e.salary > 1500) < (select Count(e.Name) from employee e
where e.status = 'Single'
And e.salary > 1000))
Group by c.Company_name;

В результате запроса - все три компании, что не есть корректно.

Заранее благодарю!
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771587
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
And e.salary > 1000))



что за 1000 для начала?
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771590
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
SELECT c.Company_Name
FROM Company c
JOIN Employee e ON c.Employee_id=e.ID
GROUP BY c.Company_Name
HAVING SUM(CASE WHEN e.Status='Married' AND e.Salary>1500 THEN 1 ELSE 0 END)
      <SUM(CASE WHEN e.Status='Single'  AND e.Salary>1500 THEN 1 ELSE 0 END);
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771591
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 c.Company_Name
from
 employee e
 inner join company c on e.ID = c.employee_id
group by
 c.Company_name
having
 count(case when e.status = 'Married' and e.salary > 1500 then 1 end) < count(case when e.status = 'Single' and e.salary < 1500 then 1 end);
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771598
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 c.Company_Name
from
 employee e
 inner join company c on e.ID = c.employee_id
group by
 c.Company_name
having
 count(case when e.status = 'Married' and e.salary > 1500 then 1 end) < count(case when e.status = 'Single' and e.salary < 1500 then 1 end);

Оба раза БОЛЬШЕ 1500 в условии задачи!
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771622
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapОба раза БОЛЬШЕ 1500 в условии задачи!Ок.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
 c.Company_Name
from
 employee e
 inner join company c on e.ID = c.employee_id
where
 e.salary > 1500
group by
 c.Company_name
having
 count(case when e.status = 'Married' then 1 end) < count(case when e.status = 'Single' then 1 end);
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771627
N_Reeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!
Да, извините. ошибся в условии *чем не женатых с зарплатой больше 1000*.
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771628
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Я Вас таки совсем немного чуть-чуть поправлю. Для красоты исключительно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
 c.Company_Name
from
 employee e
 inner join company c on e.ID = c.employee_id
where
 e.salary > 1500 and c.Company_Name is not null
group by
 c.Company_name
having
 count(case when e.status = 'Married' then convert(int,1) else convert(int,0) end) < count(case when e.status = 'Single' then convert(int,1) else convert(int,0) end);
// int поскольку на данном этапе развития планеты Земля количество программистов в одной компании не превышает даже миллиона
// в дальнейшем (через несколько тысячелетий) рекомедовано взамен использовать bigint
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771629
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

И даже можно записать немного не так. А еще кошернее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select
 c.Company_Name // название компании интересует непустое
from
 employee e
 inner join company c on e.ID = c.employee_id
where
 e.salary > 1500 and c.Company_Name is not null
and e.sex like N'M' // отбираем мужчин-сотрудников, потому что женщины не могут
// быть женатыми, а могут быть замужними
group by
 c.Company_name
having
 count(case when e.status like N'Married%' -- сюда подходят все женатые
then convert(int,1) else convert(int,0) end
) < count(case when e.status not like N'Married%' -- здесь неженатых исключаем, остаются неженатые и вдовцы
then convert(int,1) else convert(int,0) end);
// int поскольку на данном этапе развития планеты Земля
// количество сотрудников в одной компании не превышает даже миллиона
// в дальнейшем (через несколько тысячелетий) рекомедовано
// взамен использовать bigint
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771771
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPИ даже можно записать немного не так. А еще кошернее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select
 c.Company_Name // название компании интересует непустое
from
 employee e
 inner join company c on e.ID = c.employee_id
where
 e.salary > 1500 and c.Company_Name is not null
and e.sex like N'M' // отбираем мужчин-сотрудников, потому что женщины не могут
// быть женатыми, а могут быть замужними
group by
 c.Company_name
having
 count(case when e.status like N'Married%' -- сюда подходят все женатые
then convert(int,1) else convert(int,0) end
) < count(case when e.status not like N'Married%' -- здесь неженатых исключаем, остаются неженатые и вдовцы
then convert(int,1) else convert(int,0) end);
// int поскольку на данном этапе развития планеты Земля
// количество сотрудников в одной компании не превышает даже миллиона
// в дальнейшем (через несколько тысячелетий) рекомедовано
// взамен использовать bigint



Не, джигиты, "вы, как ни садитесь, а в программисты не годитесь".
Зачем вы суете join под группировку?
Ведь ни разу не надо.
Сервер надо любить.

ЗЫ. count(1) = count(0)
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771802
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222Не, джигиты, "вы, как ни садитесь, а в программисты не годитесь".
Зачем вы суете join под группировку?
Ведь ни разу не надо.
Сервер надо любить.Так до сих пор и не осознал, что сервер лучше тебя разбирается что сувать под группировку, а что нет?
Снова решил поумничать, даже не посмотрев на структуру исходных данных?
Может тебе уже пора поразмышлять над смыслом пословицы о соринке в чужом глазу?
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771829
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N_ReekeСпасибо всем!
Да, извините. ошибся в условии *чем не женатых с зарплатой больше 1000*.Тогда лучше
Код: sql
1.
WHERE e.Status='Married' AND e.Salary>1500 OR e.Status='Single' AND e.Salary>1000

чтобы в WHERE сразу отбросить заведомо неподходящие записи с разными зарплатами.
А в HAVING проверять только Status. Как у invm.
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771854
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmaleks222Не, джигиты, "вы, как ни садитесь, а в программисты не годитесь".
Зачем вы суете join под группировку?
Ведь ни разу не надо.
Сервер надо любить.Так до сих пор и не осознал, что сервер лучше тебя разбирается что сувать под группировку, а что нет?
Снова решил поумничать, даже не посмотрев на структуру исходных данных?
Может тебе уже пора поразмышлять над смыслом пословицы о соринке в чужом глазу?
Наивный.
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771865
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222Наивный.Это да

Невозможно представить ситуацию, когда наш "гура" и "носитель абсолютной истины" признает свою неправоту


Еще раз убеждаюсь - тебе просто нравится выставляться идиотом...
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771875
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmaleks222Наивный.Это да

Невозможно представить ситуацию, когда наш "гура" и "носитель абсолютной истины" признает свою неправоту


Еще раз убеждаюсь - тебе просто нравится выставляться идиотом...

1. Любому понятно, что сервер не может сделать никаких предположений относительно company и, в любом случае, сначала с делает соединение, а только потом группировку.
2. Факт того, что соединение под группировкой делается всегда упомянуто и в документации Микрософт.
3. Соединение двух + группировка это больше вычислений и чтений, чем просто группировка одной таблицы.
4. Поэтому, как бы гуру не надувал щеки, на фоне законов природы он такой же нуль, как и любой зауряд-прапорщик.
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771890
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2221. Любому понятно, что сервер не может сделать никаких предположений относительно company и, в любом случае, сначала с делает соединение, а только потом группировку.
2. Факт того, что соединение под группировкой делается всегда упомянуто и в документации Микрософт.
3. Соединение двух + группировка это больше вычислений и чтений, чем просто группировка одной таблицы.С нетерпением ждем демонстрации эффективного решения исходной задачи с группировкой одной таблицы или вообще без группировок.

А это тебе для осознания того, как может раскрываться "джойн под группировкой":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
use tempdb;
go

create table dbo.t1 (id int primary key, name varchar(100));
create table dbo.t2 (id int primary key, t1_id int, v int);

update statistics dbo.t1 with rowcount = 100;
update statistics dbo.t2 with rowcount = 100000;
go

set statistics xml on;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.name;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.id, b.name;
set statistics xml off;

alter table dbo.t1 add unique (name);

set statistics xml on;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.name;
set statistics xml off;
go

drop table dbo.t1, dbo.t2;
go

Хотя, что-то мне подсказывает, - осознавалка у тебя нерабочая...
aleks2224. Поэтому, как бы гуру не надувал щеки, на фоне законов природы он такой же нуль, как и любой зауряд-прапорщик.Опять в зеркале на себя любуешься?
...
Рейтинг: 0 / 0
Inner join да не простой
    #39771978
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmaleks2221. Любому понятно, что сервер не может сделать никаких предположений относительно company и, в любом случае, сначала с делает соединение, а только потом группировку.
2. Факт того, что соединение под группировкой делается всегда упомянуто и в документации Микрософт.
3. Соединение двух + группировка это больше вычислений и чтений, чем просто группировка одной таблицы.С нетерпением ждем демонстрации эффективного решения исходной задачи с группировкой одной таблицы или вообще без группировок.

А это тебе для осознания того, как может раскрываться "джойн под группировкой":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
use tempdb;
go

create table dbo.t1 (id int primary key, name varchar(100));
create table dbo.t2 (id int primary key, t1_id int, v int);

update statistics dbo.t1 with rowcount = 100;
update statistics dbo.t2 with rowcount = 100000;
go

set statistics xml on;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.name;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.id, b.name;
set statistics xml off;

alter table dbo.t1 add unique (name);

set statistics xml on;
select b.name, sum(a.v) from dbo.t2 a join dbo.t1 b on b.id = a.t1_id group by b.name;
set statistics xml off;
go

drop table dbo.t1, dbo.t2;
go

Хотя, что-то мне подсказывает, - осознавалка у тебя нерабочая...
aleks2224. Поэтому, как бы гуру не надувал щеки, на фоне законов природы он такой же нуль, как и любой зауряд-прапорщик.Опять в зеркале на себя любуешься?


Опять код не несущий смысловой нагрузки?
Вольно вам веровать, что можно выполнить джойн не выполняя джойн.
Аминь.
...
Рейтинг: 0 / 0
Inner join да не простой
    #39772048
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222Опять код не несущий смысловой нагрузки?
Вольно вам веровать, что можно выполнить джойн не выполняя джойн.Если нечего ответить по существу, то лучше промолчать.

ЗЫ: Решения задачи ТС без "джойна под группировкой" мы так и не дождемся?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Inner join да не простой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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