Получить все из Main-Table, где поле даты в Subtable старше 365 дней - чуть сложнее - PullRequest
0 голосов
/ 02 октября 2019

Хорошо, в первую очередь, отношения

Таблица клиентов:

У меня есть таблица "Клиенты" с полями "ID" и "mainID",которые в основном обеспечивают иерархию. Каждый клиент получает уникальный «идентификатор». В таблице клиентов указаны компании и сотрудники. Сотрудники содержат «ID» своей компании в поле «mainID».

Например: Пример

Как видите, записи с «ID»= 2 или 3 являются сотрудниками 1, потому что их «mainID» является «ID» (= 1) от их компании.

Таблица связи:

Тогда естьтаблица «Связь», в которой хранятся все ваши контакты с выбранным вами клиентом. Отношение к «Клиенты» осуществляется через поле «superID», которое ссылается на поле «Идентификатор» в «Клиенты». Дата установления связи указывается в поле «DATECREATE».

Моя цель:

Мне нужны все компании из таблицы «Клиенты»"где новейшее сообщение всех их сотрудников старше 365 дней.

Вот что у меня есть:

SELECT B.DATECREATE, A.* 
FROM CUSTOMERS A 
INNER JOIN COMMUNICATION B ON A.ID = B.SUPERID 
WHERE 
   DATEDIFF(DAY, B.DATECREATE, GETDATE()) >= 365 
   /* AND A.SYMBOL0 = 'Interessent' OR A.SYMBOL0 = 'Bestandskunde'*/;

К сожалению, яполучить все компании, в которых один или несколько сотрудников не общались с каждым годом, но мне нужны только компании, где все сотрудники не общались с какого-либо года.

Заранее спасибо!

PS: извините за мой плохой английский:)

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Возможно, это может помочь вам в дальнейшем.

Объявление таблиц

DECLARE @tCustomers TABLE (ID INT, MAINID INT) INSERT INTO @tCustomers VALUES 
(1, 1), --Company A 
(2, 1), --Employee A of Company A
(3, 1), --Employee B of Company A
(4, 4), --Company B
(5, 4)  --Employee A of Company B

DECLARE @tCommunication TABLE (ID INT, SuperId INT, DateCreated DATE, Communication VARCHAR(500))
INSERT INTO @tCommunication VALUES
(1, 2, '20180101','abcdefghijkl'),  --Comm of Employee A of Company A
(2, 2, '20171001','abcdefghijkl'),  --Comm of Employee A of Company A
(3, 3, '20191002','abcdefghijkl'),  --Comm of Employee B of Company A
(4, 5, '20171003','mnopqrstuvwxyz') --Comm of Employee A of Company B

Запрос

SELECT  DISTINCT c.ID, c.MAINID AS CompanyID, e.ID AS EmployeeId
FROM    @tCustomers e
    INNER JOIN (    SELECT  SuperId --Comm of an Employee older than 365 days
                    FROM    @tCommunication
                    WHERE   DATEDIFF(DAY, DateCreated, GETDATE()) > 365
                ) a 
        ON a.SuperId = e.ID
    INNER JOIN @tCustomers c
        ON c.ID = e.MAINID

Результат

ID | CompanyID | EmployeeId
===========================
1  | 1         | 2
4  | 4         | 5
0 голосов
/ 02 октября 2019

Вы можете использовать агрегацию и проверить минимум дата:

select c.mainid
from customers c join
     communication co
     on c.id = b.superid
group by c.mainid
having max(co.datecreate) < dateadd(day, -365, getdate());

РЕДАКТИРОВАТЬ:

Если вы хотите много столбцов, используйте функции окна:

select c.*
from (select c.*,
             max(co.date_create) over (partition by c.mainid) as max_datecreate
      from customers c join
           communication co
           on c.id = b.superid
     ) c
where max_datecreate < dateadd(day, -365, getdate()) and
      datecreate = max_datecreate;   -- get only one row per customer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...