Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 14.03.2019, 21:39   #1
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию Помогите составить SQL (ADO, Access) запрос

Есть таблица.


Нужно выбрать place,name,color,price у которых цена разная. name, color - совпадают, place - как бы не берется во внимание.

Должно показать то, что отмечено зеленым.


Спасибо.

Последний раз редактировалось yorri; 14.03.2019 в 22:34.
yorri вне форума   Ответить с цитированием
Старый 14.03.2019, 22:19   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,495
Репутация: 6498
По умолчанию

Сгруппировать по name, color, price. Результат сгруппировать по name, color и посчитать количество записей. И выдать из основной таблицы те, у которых это количество больше 1. Это все в одном запросе используя вложенность. В acces еще есть dcount для подсчета количества различных, но как с ним ado не в курсе
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 14.03.2019, 22:36   #3
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию

/картинки перегрузил, была ошибка. извините/
Код:

select name,color from (SELECT distinct  name,color,price from aaa order by name,color,price) group by name, color  having count(*)>1

дает такой результат
yorri вне форума   Ответить с цитированием
Старый 14.03.2019, 22:37   #4
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Сгруппировать по name, color, price. Результат сгруппировать по name, color и посчитать количество записей. И выдать из основной таблицы те, у которых это количество больше 1. Это все в одном запросе используя вложенность. В acces еще есть dcount для подсчета количества различных, но как с ним ado не в курсе
а можко пример?
я не силен сильно в sql.
спасибо
yorri вне форума   Ответить с цитированием
Старый 14.03.2019, 23:50   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,859
Репутация: 5459
По умолчанию

Цитата:
Сообщение от yorri Посмотреть сообщение
а можко пример?
Цитата:
Сгруппировать по name, color, price. Результат сгруппировать по name, color и посчитать количество записей. И выдать из основной таблицы те, у которых это количество больше 1. Это все в одном запросе используя вложенность.
я попробую представить пример.

так можно получить те name,color, у которых цена разная
Код:

select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1

ну и что-то вроде такого для получения искомого результата:
Код:

select a1.* from aaa as a1
inner join (select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1) a3 on a3.name=a1.name and a3.color=a1.color
order by a1.name, a1.color


p.s. хотел проверить в MS Access 2010, там он мне поле name не позволил создать.
пришлось переименовывать. Как Вам удалось такое имя в таблице сделать?

Последний раз редактировалось Serge_Bliznykov; 15.03.2019 в 00:01.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 15.03.2019, 01:02   #6
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я попробую представить пример.

так можно получить те name,color, у которых цена разная
Код:

select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1

ну и что-то вроде такого для получения искомого результата:
Код:

select a1.* from aaa as a1
inner join (select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1) a3 on a3.name=a1.name and a3.color=a1.color
order by a1.name, a1.color


p.s. хотел проверить в MS Access 2010, там он мне поле name не позволил создать.
пришлось переименовывать. Как Вам удалось такое имя в таблице сделать?
Да, спасибо. Как бы оно! Немножко модифицирую под себя...
yorri вне форума   Ответить с цитированием
Старый 15.03.2019, 01:41   #7
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение



ну и что-то вроде такого для получения искомого результата:
Код:

select a1.* from aaa as a1

Гм. Не могу в select a1.* from aaa as a1 вставить where...

Последний раз редактировалось yorri; 15.03.2019 в 01:50.
yorri вне форума   Ответить с цитированием
Старый 15.03.2019, 11:27   #8
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,859
Репутация: 5459
По умолчанию

Цитата:
Сообщение от yorri Посмотреть сообщение
Гм. Не могу в select a1.* from aaa as a1 вставить where...
там нельзя вставлять WHERE (почитайте основы SQL, например, книжка Мартина Грабера - "Понимание SQL")

попробуйте вставить нужное условие в конце, сразу перед ORDER BY:
Код:

select a1.* from aaa as a1
inner join (select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1) a3 on a3.name=a1.name and a3.color=a1.color
WHERE <..условия отбора..>
order by a1.name, a1.color

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 15.03.2019, 17:20   #9
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
там нельзя вставлять WHERE (почитайте основы SQL, например, книжка Мартина Грабера - "Понимание SQL")

попробуйте вставить нужное условие в конце, сразу перед ORDER BY:
Код:

select a1.* from aaa as a1
inner join (select a2.name,a2.color from
(SELECT name,color,price from aaa 
group by name, color, price) as a2
group by a2.name, a2.color
having count(*)>1) a3 on a3.name=a1.name and a3.color=a1.color
WHERE <..условия отбора..>
order by a1.name, a1.color

Спасибо.
yorri вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить SQL (ADO, Access) запрос для сравнения двух таблиц. yorri БД в Delphi 12 10.02.2018 15:17
Составить запрос на выбор определенных данных - MS Access НадеждаNV Microsoft Office Access 2 29.11.2017 17:31
Помогите составить SQL запрос DarknessLORD11 Помощь студентам 3 24.12.2015 07:35
помогите составить SQL запрос!!!! MAKSA БД в Delphi 12 07.08.2009 11:12
Помогите составить запрос или перепроектировать БД Neurotechnic БД в Delphi 1 27.07.2009 10:51


23:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru