Объединить где пункт - PullRequest
       3

Объединить где пункт

0 голосов
/ 19 сентября 2019

Мне нужно отфильтровать значение из двух столбцов с условием «объединить два», если уровень в (101,102) и Hiredate = текущий месяц будут исключены. Это мой сценарий

 SELECT EMPLOYEE_ID,EMPLOYEE_NAME, LEVEL, ORIGINAL_HIRE_DATE
FROM Table
WHERE
  (LEVEL in ('101','102') and month(ORIGINAL_HIRE_DATE) != MONTH(GETDATE()) and YEAR(ORIGINAL_HIRE_DATE) != YEAR(GETDATE())) and ACTIVE > 0 and LOCATION_CODE = '1030' 
   order by LEVEL asc

Как результат сценария для всех уровней 101,102исключен, но я хочу получить уровень 101,102 и уровень найма не равен текущему месяцу

Exampledata

enter image description here

Желаемый результат

enter image description here

Ответы [ 4 ]

0 голосов
/ 19 сентября 2019

Вы должны поместить not в начало предложения where и изменить его! = From =

create table #t1 (level int, original_hire_date date);
insert into #t1 values(101,'2019-09-19');
insert into #t1 values(102,'2019-09-19');
insert into #t1 values(103,'2019-09-19');
insert into #t1 values(104,'2019-09-19');
insert into #t1 values(200,'2019-09-19');
insert into #t1 values(101,'2018-9-11');

select *
from #t1
where not (level in ('101','102') and month(original_hire_date)=month(getdate()) and year(original_hire_date)=year(getdate()))

Результат: enter image description here

0 голосов
/ 19 сентября 2019

Я мог бы использовать EOMONTH() для текущей даты.Это приведет к:

SELECT EMPLOYEE_ID, EMPLOYEE_NAME, LEVEL, ORIGINAL_HIRE_DATE
FROM Table
WHERE LEVEL NOT (101, 102) AND
      EOMONTH(ORIGINAL_HIRE_DATE) <> EOMONTH(GETDATE()) AND
      ACTIVE > 0 AND
      LOCATION_CODE = 1030 
ORDER BY LEVEL ASC;

Я удалил одинарные кавычки из 101, 102 и 1030.Значения выглядят как числа, поэтому я предполагаю, что они есть.Используйте одинарные кавычки, только если значения являются строками (или датами).

0 голосов
/ 19 сентября 2019

Теперь я использую + два столбца, затем сравниваю это работает, но я не уверен насчет производительности и правильного способа

0 голосов
/ 19 сентября 2019

вы можете использовать format(), если ваш sql server выше 2012.

SELECT EMPLOYEE_ID,EMPLOYEE_NAME, LEVEL, ORIGINAL_HIRE_DATE
FROM Table
WHERE
    (LEVEL not in ('101','102')  and ACTIVE > 0 and LOCATION_CODE = '1030' 
UNION ALL
SELECT EMPLOYEE_ID,EMPLOYEE_NAME, LEVEL, ORIGINAL_HIRE_DATE
FROM Table
WHERE
    (LEVEL  in ('101','102') and (LEFT(CONVERT(varchar, ORIGINAL_HIRE_DATE,112),6) != LEFT(CONVERT(varchar, GetDate(),112),6))
    and ACTIVE > 0 and LOCATION_CODE = '1030' 

или вы можете использовать OR оператор

SELECT EMPLOYEE_ID,EMPLOYEE_NAME, LEVEL, ORIGINAL_HIRE_DATE
FROM Table
WHERE
  (LEVEL not in ('101','102') 
  OR
  (LEVEL in ('101','102') and (LEFT(CONVERT(varchar, ORIGINAL_HIRE_DATE,112),6) != LEFT(CONVERT(varchar, GetDate(),112),6)))
    and ACTIVE > 0 and LOCATION_CODE = '1030' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...