powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите составить SQL запрос
9 сообщений из 9, страница 1 из 1
Помогите составить SQL запрос
    #39862613
iceKreem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо отобрать клиентов, у которых есть всего два продукта, отвечающие требованиям:
1. У клиента должен быть продукт №1 (product_id = 1), у которого есть дата архивации (archive is not null);
2. У клиента должен быть продукт №2 (product_id = 2), у которого нет даты архивации (archive is null).
У клиентов может сколько угодно продуктов, но необходимо найти только тех, у которых есть всего два определенных продукта.

Платформа: Oracle
Пример с тестовыми данными привел здесь: https://www.jdoodle.com/a/1wmE
Судя по ним, результатом запроса должны быть клиенты с ИД: 12, 16

Помогите, пожалуйста, составить запрос
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862622
1C Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы создали тему с вопросом по Oracle в разделе Ms Sql Server:)

А еще местные старожилы любят спрашивать как Вы пытались решить задачу и что у Вас не получилось (халявщики и лентяи не вызывают желание помочь).
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862626
iceKreem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1C Developer, да, я отправил сообщение модератору об этом :)

Вот моя попытка решить задачу, но здесь не хватает условия, которое бы фильтровала клиентов, у которых всего два продукта, вот как это сделать я не пойму...

Код: plsql
1.
2.
3.
SELECT c1.client_id FROM contracts c1
JOIN contracts c2 on c1.client_id = c2.client_id and c2.product_id =2 and c2.archive is null
WHERE c1.product_id=1 and c1.archive is not null
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862644
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
SELECT client_id 
FROM contracts
FROUP BY client_id
HAVING SUM(CASE WHEN product_id=1 AND archive IS NOT NULL THEN 1 ELSE 0 END) > 0
   AND SUM(CASE WHEN product_id=2 AND archive IS NULL THEN 1 ELSE 0 END) > 0
   AND SUM(CASE WHEN product_id IN (1, 2) THEN 0 ELSE 1 END) = 0
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862652
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iceKreem1C Developer, да, я отправил сообщение модератору об этом :)

Вот моя попытка решить задачу, но здесь не хватает условия, которое бы фильтровала клиентов, у которых всего два продукта, вот как это сделать я не пойму...

Код: plsql
1.
2.
3.
SELECT c1.client_id FROM contracts c1
JOIN contracts c2 on c1.client_id = c2.client_id and c2.product_id =2 and c2.archive is null
WHERE c1.product_id=1 and c1.archive is not null



Код: sql
1.
NOT EXISTS (SELECT 1 FROM contracts x WHERE x.client_id = c1.client_id AND x.product_id <> c1.product_id AND x.product_id <>c2.product_id)
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862659
1C Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот Вариант:

Сначала отбираем всех клиентов у которых продукт 1 не в архиве:

Код: plsql
1.
2.
3.
SELECT c1.client_id
FROM contracts c1
WHERE c1.product_id = 1 and c1.archive is not null



Затем фильтруем тех у кого обязательно есть второй продукт в архиве:

Код: plsql
1.
2.
3.
4.
SELECT c1.client_id
FROM contracts c1
INNER JOIN contracts c2 on c1.client_id = c2.client_id and c2.product_id = 2 and c2.archive is null
WHERE c1.product_id = 1 and c1.archive is not null



Добавляем все остальные продукты:

Код: plsql
1.
2.
3.
4.
5.
SELECT c1.client_id
FROM contracts c1
INNER JOIN contracts c2 on c1.client_id = c2.client_id and c2.product_id = 2 and c2.archive is null
LEFT JOIN contracts c3 on c1.client_id = c3.client_id and c3.product_id != 2 and c3.product_id != 1
WHERE c1.product_id = 1 and c1.archive is not null



Затем группируем по клиенту и выставляем условия по одному продукту 1 и 2 категории + 0 продуктов других категорий:

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT c1.client_id
FROM contracts c1
INNER JOIN contracts c2 on c1.client_id = c2.client_id and c2.product_id = 2 and c2.archive is null
LEFT JOIN contracts c3 on c1.client_id = c3.client_id and c3.product_id != 2 and c3.product_id != 1
WHERE c1.product_id = 1 and c1.archive is not null
GROUP BY c1.client_id HAVING COUNT(c1.product_id) = 1 AND COUNT(c2.product_id) = 1 AND COUNT(c3.product_id) = 0



Запрос не оптимальный, но для демонстрации поиска решения подойдет:)
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862661
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iceKreemПлатформа: Oracle

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
т.к. пока в теме по SQL Server - то ответ на T-SQL:
declare @t table (client_id int, product_id int, archive date)
insert into @t values(11, 1,'2018-08-08'),(11, 2, null),(11, 3, '2018-08-08'),(11, 4, null),(12, 1, '2018-08-08')
,(12, 2, null),(13, 1, null),(13, 2, '2018-08-08'),(13, 3, '2018-08-08'),(13, 4, '2018-08-08'),(15, 1, '2018-08-08')
,(15, 2, null),(15, 3, null),(15, 4, null),(16, 1, '2018-08-08'),(16, 2, null),(17, 1, null),(17, 2, '2018-08-08')
,(17, 3, null),(17, 4, '2018-08-08')
select client_id from @t group by client_id having count(distinct product_id)=2
intersect --можно и inner join
select client_id from @t where (product_id=1 and archive is not null) or (product_id=2 and archive is null) group by client_id
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862685
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select c.client_id from contracts c
join contracts c1 on c.client_id=c1.client_id and c1.product_id=1 and c1.archive is not null
join contracts c2 on c.client_id=c2.client_id and c2.product_id=2 and c2.archive is null
group by c.client_id
having count(*)=2
...
Рейтинг: 0 / 0
Помогите составить SQL запрос
    #39862732
iceKreem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо всем за Ваши варианты решения, очень помогли!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите составить SQL запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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