联合选择过滤

时间:2018-09-27 15:50:09

标签: tsql report-builder2.0

这是我在网站上提出的第一个问题,对于该问题的标题含糊不清或令人误解,我深表歉意,但在撰写此问题时我无法提出更好的建议。

对于在给定时期内请病假的用户,我需要在Report Builder 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的结果被识别为字段。

示例:

  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 :(得分:0)

您可以使用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;

可以通过向Leave表中添加适当的数据并检查“给定时间段”和休假时间段之间是否有重叠来处理“给定时间段”的要求。

提示:重叠范围的常规检查是Start1 <= End2 and Start2 <= End1。请参阅overlap标签Wiki以获得解释。

答案 1 :(得分:-1)

如果您使用工会将有病和无病的人合并到一个大列表中,但想区分这两个组,则只需添加一个标志即可。

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 people0 = none sick people。然后,您可以基于此进行过滤以获取不同的组。