|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Есть таблица Store: ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 22:42 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Прошу прощения, первый раз на этом форуме и не разобрался с управлением. Короче, есть таблица (файл 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(*)? Помогите, в понедельник пересдача, а ничего не готово. Пожалуйста!!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 23:22 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Не прогрузился второй скрин (результат запроса) Вот он ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 23:24 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 К ней есть задание: создать запрос который выведет все уникальные названия поставщиков (SUPPLIER) в рамках названий товаров (PRODUCT). Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 23:37 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
alexeyvg, Потому, что Ваш запрос выведет все уникальные пары PRODUCT-SUPPLIER (из получилось 56), а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать. Результирующий набор должен состоять из 29 строк (для данной таблицы из 59 записей) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 23:48 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 задание: создать запрос который выведет все уникальные названия поставщиков (SUPPLIER) в рамках названий товаров (PRODUCT). Mihail67 только те пары, у которых PRODUCT имеет только один SUPPLIER Это две принципиально разные задачи. Последняя решается использованием COUNT(SUPPLIER) OVER (PARTITION BY PRODUCT) в CTE. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 23:53 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Akina, авторЭто две принципиально разные задачи. но у прерода такое понимание правильного решения 22040528 авторПоследняя решается использованием COUNT(SUPPLIER) OVER (PARTITION BY PRODUCT) в CTE. Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!! А без COUNT() здесь уже точно не обойтись? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 00:26 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
SELECT PRODUCT, max(supplier) FROM STORE GROUP BY PRODUCT Having count(distinct supplier) =1 Я бы так написал Хотя преподавателю может не понравиться А по ресурсам даже не скажу, что лучше, групп бай или сте с аналитикой ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 01:50 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!! А без COUNT() здесь уже точно не обойтись? Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Но вот как сделать только с JOIN, никак не соображу... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 09:17 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
alexeyvg Mihail67 Большое спасибо! Результат остался прежним, но уже без использования GROUP BY!!!!!!!!!!! А без COUNT() здесь уже точно не обойтись? Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Но вот как сделать только с JOIN, никак не соображу... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 09:47 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
без COUNT и с JOIN-ом :)) Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 10:38 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать. Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 10:54 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
invm Mihail67 а нужно только те пары, у которых PRODUCT имеет только один SUPPLIER, а те, у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать. Код: sql 1. 2. 3. 4. 5. 6. 7.
Эквивалентно Код: sql 1. 2. 3. 4.
имхо т.е. условие "у которых PRODUCT имеет 2 и более SUPPLIER нужно игнорировать" не выполнится ... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 11:06 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
court без COUNT и с JOIN-ом :)) Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 11:15 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
court Эквивалентно Код: sql 1. 2. 3. 4.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 11:20 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
andreymx, спасибо, это явно не подходит из-за наличия GROUP BY и HAVING ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 11:40 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
court, Спасибо, но Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]). Ваш запрос это не учитывает и удваивает эти строки (которых вовсе не должно быть в выборке). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 12:18 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
andreymx, Спасибо, но Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]). Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 12:23 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
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 обрабатываю результирующий набор) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 12:28 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
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 ....) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 12:47 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
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 Через 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() в запросах. Посему, тему можно считать закрытой. Спасибо всем! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 17:14 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 Надеюсь, у препода не возникнет вопросов к наличию COUNT() в запросах. А то тут у вас COUNT, вдруг аналитические функции тоже нельзя, как и GROUP BY ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 18:10 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
invm court Эквивалентно Код: sql 1. 2. 3. 4.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 10:52 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
alexeyvg Так с EXISTS почему не подошло? Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]). Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке). alexeyvg А то тут у вас COUNT, вдруг аналитические функции тоже нельзя, как и GROUP BY Можно или нельзя - вторично по сравнению с правильная выборка или неправильная. Как это сделать без COUNT (и чтоб выборка была правильной) я не знаю, и здесь никто ничего не предложил. Поэтому .... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 19:00 |
|
Помогите изменить SQL-запрос
|
|||
---|---|---|---|
#18+
Mihail67 alexeyvgТак с EXISTS почему не подошло? Ваш запрос пропустил одну деталь: в базе есть записи с идентичными данными в PRODUCT и SUPPLIER соответственно. То-есть, мало того, что они повторяются, они еще и раны между собой (пары [PRODUCT;SUPPLIER]). Ваш запрос это не учитывает и выводит эти строки (которых вовсе не должно быть в выборке).А, понятно. Я исходил из того, что PRODUCT,SUPPLIER - уникальны. Тогда да, такую задачу с exists не решить, если в таблице нету PK Вообще, очень много нельзя сделать, если в таблице нету PK :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 21:23 |
|
|
start [/forum/topic.php?fid=46&fpage=76&tid=1686772]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
3ms |
others: | 339ms |
total: | 481ms |
0 / 0 |