Union Select фильтрация - PullRequest
       42

Union Select фильтрация

0 голосов
/ 27 сентября 2018

Это мой первый вопрос на сайте, и я прошу прощения за неопределенное или вводящее в заблуждение название вопроса, но я не смог придумать что-то лучшее во время написания этого вопроса.

Мне нужно изменитьотчет в построителе отчетов 2.0, использующий запрос в виде текста, а не хранимую процедуру, для пользователей, ушедших в больничный лист за определенный период.Но «подвох» заключается в том, что я должен включать пользователей, у которых ноль случаев отпуска по болезни.Текущий запрос в псевдокоде выглядит следующим образом:

SELECT 
    UserName
    FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'

Существует метка, которая подсчитывает различный набор результатов и представляет их как число случаев заболевания.Мне посоветовали воспользоваться профсоюзом, но профсоюз вернет записи, которые также не являются больничными.Как я буду выполнять фильтрацию, чтобы различать отпуск по болезни и другие отпуска?

Пример:

 SELECT 
    UserName
    FROM Leave
    WHERE location = 'NY'
    AND leave_type = 'Sick'
UNION
SELECT 
    UserName
    FROM Leave
    WHERE location = 'NY'  

Я также не смог выяснить, как выполнить запрос для пользователей без отпуска по болезни.и вернуть его как отдельное поле для отчета.Я могу получить только результаты первого Выбрать как поля.Это значит, что в запросе не может быть двух Select, и поля отчета заполнены ими обоими.Только результаты первого выбора распознаются как поля в построителе отчетов.

Пример:

  SELECT 
        UserNameWithSickLeave
        FROM Leave
        WHERE location = 'NY'
        AND leave_type = 'Sick'

SELECT UserNameWithoutSickLEave
FROM users
where username NOT IN(
 SELECT 
        UserNameWithSickLeave
        FROM Leave
        WHERE location = 'NY'
        AND leave_type = 'Sick'
)

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы можете использовать distinct, чтобы получить имена пользователей и выражение case с коррелированным подзапросом, и exists, чтобы проверить, уходил ли пользователь когда-либо по болезни.

-- Sample data.
declare @Leave as Table ( UserName VarChar(10), Location VarChar(2), Leave_Type VarChar(10) );
insert into @Leave ( UserName, Location, Leave_Type ) values
  ( 'Amy', 'NY', 'happy' ),
  ( 'Bob', 'NY', 'sick' ),
  ( 'Bob', 'NY', 'vacation' ),
  ( 'Cat', 'NY', 'pet' );
select * from @Leave;

-- The query.
select distinct UserName,
  case when exists ( select 42 from @Leave as IL where IL.UserName = L.UserName and Leave_Type = 'sick' )
    then 1
    else 0 end as Sick
  from @Leave as L;

The "заданный период «требование может быть обработано путем добавления подходящих данных в таблицу Leave и проверки на любое перекрытие между« заданным периодом »и периодом отпуска.

Совет. Общая проверка для перекрывающихся диапазонов составляет Start1 <= End2 and Start2 <= End1.Обратитесь к вики-тегу overlap для объяснения.

0 голосов
/ 27 сентября 2018

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

SELECT 
UserName
1 AS [Sick] -- edit here
FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'

UNION

SELECT 
UserName
0 AS [Sick] -- edit here
FROM Leave
WHERE location = 'NY' 

Затем он должен дать вамполный список, но теперь дополнительный столбец с надписью 1 = sick people и 0 = none sick people.Затем вы можете фильтровать на основе этого, чтобы получить свои отдельные группы.

...