tsql - 联合选择过滤
问题描述
这是我在网站上提出的第一个问题,对于问题的模糊或误导性标题,我深表歉意,但在撰写此问题时我无法提出更好的建议。
我需要更改 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 as 字段的结果。这意味着我不能在查询中有两个 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'
)
谢谢你。
解决方案
您可以使用相关子查询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。
推荐阅读
- android - 文本大小和背景颜色没有改变..更改xml代码也没有改变..底部添加了图像链接
- python - 如何使用正则表达式来帮助抓取 Web 数据?
- amazon-eks - standard_init_linux.go:219:exec 用户进程导致:exec 格式错误 ECR + Quarkus
- bash - 在多个子目录下执行多个同名的shell脚本
- javascript - TypeError:event.preventDefault 不是函数
- sql - 我可以在 access.form 而不是每个 form.event 中 c.connect 一次吗?
- css - 在两列行css中对齐div
- javascript - 在 Vercel 上托管时 NuxtJS 生产中的 URIError
- google-chrome - 如何设置 Chrome 插件清单,以便内容脚本仅在某些子域上运行?
- javascript - 在 Cypress 中,如何从定义的数组列表中单击特定值?