SQL Server:如何使用2个查询用例获得1个不同的查询结果?



我正在处理的表是一个员工登录数据库。除其他事项外,它将能够识别员工的进入时间,并报告他在一组日期内的进入情况。

我现在面临的问题是:当老板想看看工人在特定日期的登录和注销情况时。他想:

a( 设置日期和名称,并使查询返回该员工在该特定日期的访问权限。

b( 如果他没有输入名字,那么它将返回该日期每个人的列表。

No | Name | ID  | Date       | Log-in | Log-out | Description
---+------+-----+------------+--------+---------+---------------------
1  | Joe1 | j1  | 2018/10/02 | 09:00  |  18:00  | Normal Exit
2  | Joe2 | j2  | 2018/10/02 | 10:00  |  17:00  | Meeting
.. | ...  | .   |   .  . .   |   . .  |   . . . | . . . . 
N  | JoeN | jN  | yyyy/mm/dd | hh/mm  |  hh/mm  | Whatever text

所以对于第一部分,我用一个简单的

select * 
from DB
where @name = '*the name of the person to look for*' 
and @date = '*specific date*' (is a date variable yyyy-mm-dd)

全部完成。现在下一部分似乎很奇怪,还无法弄清楚。

我正在尝试将 IIF 方案作为子查询,但没有执行它返回完整列表的部分。

接下来是在哪里,但也不能让它工作。我缺少程序要检查的变量:

如果没有要查找的名称=>当天与每个人一起显示表

如果有要查找的名称 =>显示该人的表

如何使我的程序区分最后显示哪个表?

干杯!

编辑:

已添加(感谢您的建议(查询以获得更好的帮助

CREATE TABLE DailyRegisters
(
No          INTEGER  NOT NULL PRIMARY KEY,
Name        VARCHAR(50) NOT NULL,
ID          VARCHAR(50) NOT NULL,
Date        DATE  NOT NULL,
Login       DATETIME  NOT NULL,
Logout      DATETIME  NOT NULL,
Description VARCHAR(50) NOT NULL
);
INSERT INTO DailyRegisters (No, Name, ID, Date, Login, Logout, Description) 
VALUES (1,'Person 1','P1','10/2/2018','9:00','18:00','Normal'),
(2,'Person 2','P2','10/2/2018','9:01','18:00','Normal'),
(3,'Person 3','P3','10/2/2018','10:17','16:00','Plant'),
(4,'Person 4','P4','10/2/2018','10:10','18:00','Normal'),
(5,'Person 1','P1','10/3/2018','9:01','18:00','Normal'),
(6,'Person 2','P2','10/3/2018','9:02','18:00','Normal'),
(7,'Person 3','P3','10/3/2018','9:04','18:00','Normal'),
(8,'Person 1','P1','10/4/2018','9:00','18:00','Normal'),
(9,'Person 2','P2','10/4/2018','9:00','14:00','Meeting'),
(10,'Person 3','P3','10/4/2018','9:17','18:00','Normal'),
(11,'Person 4','P4','10/4/2018','9:00','18:00','Normal'),
(12,'Person 1','P1','10/5/2018','9:00','18:00','Normal'),
(13,'Person 3','P3','10/5/2018','9:00','20:00','Plant'),
(14,'Person 4','P4','10/5/2018','9:00','18:00','Normal');

您只需要处理未指定名称的情况,如下所示:

select * from DB 
where 
((@name is not null AND name = @name) or (@name is null)) 
AND date = @date;

基本上,如果@name参数为空,则上述查询不会检查名称。当然,不言而喻,@name@date是传递给查询的参数。

我还建议不要使用select *而是指定列: 最好在表架构更改的情况下进行维护。

最新更新