powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите изменить SQL-запрос
25 сообщений из 26, страница 1 из 2
Помогите изменить SQL-запрос
    #39903072
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица Store:
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903076
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, первый раз на этом форуме и не разобрался с управлением.
Короче, есть таблица (файл 1.jpg)
К ней есть задание: создать запрос который выведет все уникальные названия поставщиков (SUPPLIER) в рамках названий товаров (PRODUCT).
Я составил запрос
select st1.PRODUCT, st1.SUPPLIER
from store as st1
join
(SELECT count(*) as c, PRODUCT
FROM STORE
GROUP BY PRODUCT) AS st2 ON st1.PRODUCT=st2.PRODUCT and st2.c=1
который со слов препода есть правильным (выводит правильный результат) (файл 2.jpg)
но препод потребовал из этого запроса убрать GROUP BY и count(*), составить новый запрос использовав только JOIN.
Вот уже второй день сижу и ничего не могу сделать: ведь GROUP BY и count(*) - агрегатные функции, а JOIN - обработчик условий, ограничивающий результирующий набор.
Кто-то может подсказать, как можно использовать JOIN вместо GROUP BY и count(*)?
Помогите, в понедельник пересдача, а ничего не готово.
Пожалуйста!!!!!
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903077
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не прогрузился второй скрин (результат запроса)
Вот он
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903078
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
К ней есть задание: создать запрос который выведет все уникальные названия поставщиков (SUPPLIER) в рамках названий товаров (PRODUCT).
Почему не просто:
Код: sql
1.
2.
3.
select distinct st1.PRODUCT, st1.SUPPLIER
from store as st1
order by st1.PRODUCT
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903081
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, Потому, что Ваш запрос выведет все уникальные пары PRODUCT-SUPPLIER (из получилось 56), а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать.
Результирующий набор должен состоять из 29 строк (для данной таблицы из 59 записей)
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903083
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
задание: создать запрос который выведет все уникальные названия поставщиков (SUPPLIER) в рамках названий товаров (PRODUCT).

Mihail67
только те пары, у которых PRODUCT имеет только один SUPPLIER

Это две принципиально разные задачи.
Последняя решается использованием COUNT(SUPPLIER) OVER (PARTITION BY PRODUCT) в CTE.
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903089
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
авторЭто две принципиально разные задачи.
но у прерода такое понимание правильного решения 22040528

авторПоследняя решается использованием COUNT(SUPPLIER) OVER (PARTITION BY PRODUCT) в CTE.

Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!!

А без COUNT() здесь уже точно не обойтись?
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903101
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT PRODUCT, max(supplier)
FROM STORE
GROUP BY PRODUCT
Having count(distinct supplier) =1

Я бы так написал
Хотя преподавателю может не понравиться

А по ресурсам даже не скажу, что лучше, групп бай или сте с аналитикой
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903110
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!!

А без COUNT() здесь уже точно не обойтись?
Можно с EXISTS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select st1.PRODUCT, st1.SUPPLIER
from store as st1
where not exists( 
	select *
	from store st2
	where st1.PRODUCT=st2.PRODUCT 
		and st1.SUPPLIER <> st2.SUPPLIER
)



Но вот как сделать только с JOIN, никак не соображу...
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903111
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Mihail67
Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!!

А без COUNT() здесь уже точно не обойтись?
Можно с EXISTS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select st1.PRODUCT, st1.SUPPLIER
from store as st1
where not exists( 
	select *
	from store st2
	where st1.PRODUCT=st2.PRODUCT 
		and st1.SUPPLIER <> st2.SUPPLIER
)




Но вот как сделать только с JOIN, никак не соображу...
без группировки или аналитики тоже не вижу решения
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903113
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без COUNT и с JOIN-ом :))

Код: sql
1.
2.
3.
4.
5.
;with cte as (
    select *, min(SUPPLIER) OVER (PARTITION BY PRODUCT) as xz1, max(SUPPLIER) OVER (PARTITION BY PRODUCT) as xz2  from store )

select t1.*
from cte t1 inner join cte t2 on t1.xz1=t2.xz2 and t1.PRODUCT=t2.PRODUCT
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903115
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать.
Код: sql
1.
2.
3.
4.
5.
6.
7.
select distinct
 a.PRODUCT, a.SUPPLIER
from
 store a left join
 store b on b.PRODUCT = a.PRODUCT and b.SUPPLIER <> a.SUPPLIER
where
 b.PRODUCT is null;
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903118
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Mihail67
а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать.
Код: sql
1.
2.
3.
4.
5.
6.
7.
select distinct
 a.PRODUCT, a.SUPPLIER
from
 store a left join
 store b on b.PRODUCT = a.PRODUCT and b.SUPPLIER <> a.SUPPLIER
where
 b.PRODUCT is null;


Эквивалентно
Код: sql
1.
2.
3.
4.
select distinct
 a.PRODUCT, a.SUPPLIER
from
 store a


имхо

т.е. условие "у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать" не выполнится ...
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903120
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
без COUNT и с JOIN-ом :))

Код: sql
1.
2.
3.
4.
5.
;with cte as (
    select *, min(SUPPLIER) OVER (PARTITION BY PRODUCT) as xz1, max(SUPPLIER) OVER (PARTITION BY PRODUCT) as xz2  from store )

select t1.*
from cte t1 inner join cte t2 on t1.xz1=t2.xz2 and t1.PRODUCT=t2.PRODUCT

всё равно аналитика
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903122
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
Эквивалентно
Код: sql
1.
2.
3.
4.
select distinct
 a.PRODUCT, a.SUPPLIER
from
 store a

Код: 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.
25.
26.
27.
declare @t table (g int, v int);
insert into @t
values
 (1, 1), (1, 1), (2, 1), (2, 2);

select distinct
 g, v
from
 @t;

select distinct
 a.g, a.v
from
 @t a left join
 @t b on b.g = a.g and b.v <> a.v
where
 b.g is null;

select g, v from @t

except

select
 a.g, a.v
from
 @t a join
 @t b on b.g = a.g and b.v <> a.v;
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903125
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, спасибо, это явно не подходит из-за наличия GROUP BY и HAVING
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903139
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, Спасибо, но Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]).
Ваш запрос это не учитывает и удваивает эти строки (которых вовсе не должно быть в выборке).


...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903141
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, Спасибо, но Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]).
Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке).


...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903145
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mihail67, Извините за наглость (Вы и так мне очень помогли), но не могли-бы Вы еще подсказать, как заменить запрос
SELECT ID_STUFF,STAFF_NAME, E_MAIL
FROM [sale].[dbo].[INVOICE]
GROUP BY ID_STUFF, STAFF_NAME, E_MAIL

через COUNT(...) OVER (PARTITION BY ....)

Задание аналогичное, с разницей: триада ID_STUFF, STAFF_NAME, E_MAIL встечается только один раз (а этим запросом я считаю сколько раз она встретилась, затем Join обрабатываю результирующий набор)

Спасибо.
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903148
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Извините за наглость (Вы и так мне очень помогли), но не могли-бы Вы еще подсказать?
Задание аналогичное, с разницей: триада ID_STUFF, STAFF_NAME, E_MAIL встечается только один раз.
Этим запросом я считаю сколько раз она встретилась, затем Join обрабатываю результирующий набор.

select count(*) as count_STUFF, ID_STUFF
FROM
(SELECT ID_STUFF,STAFF_NAME, E_MAIL
FROM [sale].[dbo].[INVOICE]
GROUP BY ID_STUFF, STAFF_NAME, E_MAIL) As Inv
group by Inv.ID_STUFF

Этим запросом я получаю выборку с количеством уникальных триад ID_STUFF, STAFF_NAME, E_MAIL




Помогите записать мой запрос через COUNT(...) OVER (PARTITION BY ....)

Спасибо.
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903197
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mihail67

Помогите записать мой запрос через COUNT(...) OVER (PARTITION BY ....)


Проблема решена:
Создал представление, формирующее результирующий набор из ID_STUFF и количества различных E_MAIL
Create view Stuff1
as
select COUNT(E_MAIL) OVER (PARTITION BY ID_STUFF) as count_EMAIL, ID_STUFF
from
(SELECT DISTINCT(E_MAIL), ID_STUFF, STAFF_NAME
FROM INVOICE) As inv
Первая таблица - внутренний SELECT, вторая - основной



Через JOIN обьеденил две таблицы в итоговый результат
select inv1.*
from INVOICE as inv1
join
(SELECT * FROM Stuff1 ) AS inv2
ON inv1.ID_STUFF=inv2.ID_STUFF and inv2.count_EMAIL=1




Результат идентичен решению с использованием GROUP BY.
Надеюсь, у препода не возникнет вопросов к наличию COUNT() в запросах.
Посему, тему можно считать закрытой.

Спасибо всем!
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903206
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
Надеюсь, у препода не возникнет вопросов к наличию COUNT() в запросах.
Так с EXISTS почему не подошло?
А то тут у вас COUNT, вдруг аналитические функции тоже нельзя, как и GROUP BY
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903311
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
court
Эквивалентно
Код: sql
1.
2.
3.
4.
select distinct
 a.PRODUCT, a.SUPPLIER
from
 store a


Код: 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.
25.
26.
27.
declare @t table (g int, v int);
insert into @t
values
 (1, 1), (1, 1), (2, 1), (2, 2);

select distinct
 g, v
from
 @t;

select distinct
 a.g, a.v
from
 @t a left join
 @t b on b.g = a.g and b.v <> a.v
where
 b.g is null;

select g, v from @t

except

select
 a.g, a.v
from
 @t a join
 @t b on b.g = a.g and b.v <> a.v;

да, ерунду сморозил, сори :)
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903671
Mihail67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Так с EXISTS почему не подошло?


Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]).
Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке).




alexeyvg

А то тут у вас COUNT, вдруг аналитические функции тоже нельзя, как и GROUP BY


Можно или нельзя - вторично по сравнению с правильная выборка или неправильная.
Как это сделать без COUNT (и чтоб выборка была правильной) я не знаю, и здесь никто ничего не предложил.
Поэтому ....
...
Рейтинг: 0 / 0
Помогите изменить SQL-запрос
    #39903721
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mihail67
alexeyvgТак с EXISTS почему не подошло?


Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]).
Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке).А, понятно.
Я исходил из того, что PRODUCT,SUPPLIER - уникальны.
Тогда да, такую задачу с exists не решить, если в таблице нету PK
Вообще, очень много нельзя сделать, если в таблице нету PK :-)
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите изменить SQL-запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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