SQL данные группировки запросов не в - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужен запрос для извлечения данных из таблицы за дату, где у EmpID есть только один код. Вот примерные данные, чтобы проиллюстрировать

CREATE TABLE dbo.#Cars 
   (   
   File_date smalldatetime, 
   Code varchar(10), 
   EmpID varchar(10)
   ) 

   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-01', 'ABC', '1234')
   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-01', 'XYZ', '1234')

   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-02', 'ABC', '3456')
   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-02', 'XYZ', '3456')

   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-03', 'ABC', '1234')
   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-03', 'XYZ', '4444')

   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-04', 'ABC', '3456')
   INSERT into #Cars (File_date, Code, EmpID) values ('2020-03-04', 'XYZ', '1234')

Я хочу записи только с кодом 'XYZ' на дату. Это означает, что я не хочу записи, если они имели AB C и XYZ на определенную дату. Таким образом, в приведенном выше случае EmpID 4444 на 2020-03-03 и EmpID 1234 на 2020-03-04.

Я пробовал следующее, но не работает:

  Select a.* 
   from #cars a 
   where EmpID not in 
    ( select EmpID from #cars where code = 'ABC')
   and code = 'XYZ'

, пожалуйста, руководство

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Давайте разберемся с этим.

Сначала вы хотите, чтобы все строки из #cars имели код 'XYZ'

select c1.* from #cars c1
where c1.code='xyz'

Затем вы хотите увидеть, есть ли у каких-либо строк какие-либо другие коды с той же датой и empid. , Таким образом, вы оставили соединение обратно в той же таблице с тем же empid и датой, но с другим кодом

select c1.* from #cars c1
    left join #cars c2 on c1.empid=c2.empid 
                and c1.file_date=c2.file_date 
                and c1.code<> c2.code
where c1.code='xyz'

Поскольку это соединение слева, любые совпадения будут иметь значение для empid для второй таблицы, любое, что не будет иметь значение null для empid для второй таблицы. Поскольку нам нужны только те, у которых нет совпадений с другими значениями, мы добавляем c2.empid в NULL к предложению where

select c1.* from #cars c1
    left join #cars c2 on c1.empid=c2.empid 
                   and c1.file_date=c2.file_date and
                   c1.code<> c2.code
where c1.code='xyz' and c2.empid is null
1 голос
/ 03 апреля 2020

Используйте предложение having:

 select file_date, empid
 from #cars
 group by file_date, empid
 having min(code) = max(code) and min(code) = 'xyz';

Если у вас есть только два значения, вы можете упростить это до:

 select file_date, empid
 from #cars
 group by file_date, empid
 having min(code) = 'xyz';

Здесь является дб <> скрипку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...