联合 Select 过滤
Union Select filtering
这是我在网站上的第一个问题,对于问题的模糊或误导性标题,我深表歉意,但在撰写此问题时我想不出更好的东西。
我需要在 Report Builder 2.0 中为在给定时间段内请病假的用户更改报表,将查询用作文本而不是存储过程。但是 "catch" 是我必须包括病假为零的用户。伪代码中的当前查询是这样的:
SELECT
UserName
FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'
有一个标签可以统计不同的结果集并将它们呈现为疾病发生的次数。有人建议我使用工会,但工会也会 return 不是病假的条目。我将如何过滤以区分病假和其他假期?
示例:
SELECT
UserName
FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'
UNION
SELECT
UserName
FROM Leave
WHERE location = 'NY'
我也找不到如何 运行 没有任何病假的用户的查询和 return 它作为报告的单独字段。我只能得到第一个 Select 作为字段的结果。这意味着我不能在查询中有两个 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'
)
谢谢。
如果您使用工会将病人和 none 病人合并到一个大列表中,但想要区分这两个组,您可以添加一个标志。
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
。然后你可以根据它进行过滤以获得不同的组。
您可以使用 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;
"given period" 要求可以通过将 suitable 数据添加到 Leave
table 并检查 "given period" 和请假期间。
提示:重叠范围的一般检查是 Start1 <= End2 and Start2 <= End1
。请参阅 overlap
标签 wiki 以获取解释。
这是我在网站上的第一个问题,对于问题的模糊或误导性标题,我深表歉意,但在撰写此问题时我想不出更好的东西。
我需要在 Report Builder 2.0 中为在给定时间段内请病假的用户更改报表,将查询用作文本而不是存储过程。但是 "catch" 是我必须包括病假为零的用户。伪代码中的当前查询是这样的:
SELECT
UserName
FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'
有一个标签可以统计不同的结果集并将它们呈现为疾病发生的次数。有人建议我使用工会,但工会也会 return 不是病假的条目。我将如何过滤以区分病假和其他假期?
示例:
SELECT
UserName
FROM Leave
WHERE location = 'NY'
AND leave_type = 'Sick'
UNION
SELECT
UserName
FROM Leave
WHERE location = 'NY'
我也找不到如何 运行 没有任何病假的用户的查询和 return 它作为报告的单独字段。我只能得到第一个 Select 作为字段的结果。这意味着我不能在查询中有两个 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'
)
谢谢。
如果您使用工会将病人和 none 病人合并到一个大列表中,但想要区分这两个组,您可以添加一个标志。
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
。然后你可以根据它进行过滤以获得不同的组。
您可以使用 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;
"given period" 要求可以通过将 suitable 数据添加到 Leave
table 并检查 "given period" 和请假期间。
提示:重叠范围的一般检查是 Start1 <= End2 and Start2 <= End1
。请参阅 overlap
标签 wiki 以获取解释。