如何获得先进先出并转换为另一种格式

时间:2016-04-26 08:25:07

标签: sql-server date time

提前感谢您的帮助。

您好,我有一个表AttendDB如下图所示它有很多混乱的数据。


Name    Date    Time    Status
4900651 14/12/2015  7:52    I
4900651 14/12/2015  12:26   O
4900651 14/12/2015  12:27   I
4900651 14/12/2015  17:04   O
4900651 15/12/2015  7:51    I
4900651 15/12/2015  12:04   O
4900651 15/12/2015  12:08   I
4900651 15/12/2015  17:03   O
4900651 16/12/2015  7:50    I
4900651 16/12/2015  12:12   O
4900651 16/12/2015  12:13   I
4900651 16/12/2015  17:03   O
4900651 17/12/2015  7:52    I
4900651 17/12/2015  12:09   O
4900651 17/12/2015  12:35   I
4900651 17/12/2015  17:02   O
4900651 18/12/2015  7:54    I
4900651 18/12/2015  12:16   O
4900651 18/12/2015  12:17   I
4900651 18/12/2015  17:04   O
4900651 21/12/2015  7:48    I
4900651 22/12/2015  7:49    I
4900651 22/12/2015  12:11   O
4900651 22/12/2015  12:31   I
4900651 23/12/2015  7:46    I
4900651 23/12/2015  12:13   O
4900651 23/12/2015  12:13   I
4900651 23/12/2015  17:05   O
4900651 24/12/2015  7:49    I
4900651 24/12/2015  12:22   O
4900651 24/12/2015  12:23   I
4900651 24/12/2015  17:04   O
4900651 25/12/2015  7:54    I
4900651 25/12/2015  12:27   i
4900651 25/12/2015  12:28   O
4900651 25/12/2015  12:28   I
4900651 25/12/2015  17:04   O
4900651 26/12/2015  7:46    I
4900652 9/12/2015   11:28   I
4900652 11/12/2015  8:55    I
4900652 12/12/2015  16:10   I
4900652 12/12/2015  16:10   I
4900652 12/12/2015  16:10   I
4900652 12/12/2015  16:11   I
4900652 12/12/2015  16:12   I
4900652 12/12/2015  17:01   O 

数据中每个名称条目都有很多数据,因为我的人力资源部门希望每个工作日保留6次员工"进出(午餐)进入(午餐后) - 出去(工作)进入(ot)-out (ot)我希望输出作为第一个输入,最后显示在下面


Name    Date    Time    Status
4900651 14/12/2015  7:52    I
4900651 14/12/2015  17:04   O
4900651 15/12/2015  7:51    I
4900651 15/12/2015  17:03   O
4900651 16/12/2015  7:50    I
4900651 16/12/2015  17:03   O
4900651 17/12/2015  7:52    I
4900651 17/12/2015  17:02   O
4900652 14/12/2015  7:58    I
4900652 15/12/2015  17:04   O

如果我想查询文件格式如下,它可以做到吗? 感谢许多帮助


4900651,14122015,0752I
4900651,14122015,1704O
4900651,15122015,0751I
4900651,15122015,1703O
4900651,16122015,0750I
4900651,16122015,1703O
4900651,17122015,0752I
4900651,17122015,1702O
4900652,14122015,0758I
4900652,15122015,1704O

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询来获取所需的结果

SELECT NAME,
       DATE,
       CASE WHEN STATUS='I' THEN MIN(TIME)
       ELSE
       MAX(TIME)
       END
       TIME,
       STATUS 
FROM AttendDB GROUP BY NAME,DATE,STATUS

要生成文件,您可以使用以下代码

SELECT convert(varchar(20),NAME)+','+
       convert(varchar(20),DATE)+','+
       CASE WHEN STATUS='I' THEN convert(varchar(20),MIN(TIME))
       ELSE
       convert(varchar(20),MAX(TIME))
       END +status output
FROM   AttendDB GROUP BY NAME,DATE,STATUS

要将上述查询结果返回到文件中,您必须按照以下步骤进行操作

  1. 将以上查询保存在.sql文件中。

  2. 打开cmd并输入sqlcmd -U user_name -S server_name -i input file(.sql) -o (Output file path) C:\users\query.txt(example)

  3. 输入您的密码。
  4. 注意: - 输入文件包含查询。

    完成上述所有步骤后,查询返回的结果将复制到query.txt文件中。这并不意味着我们只能使用.txt,我们也可以使用.csv等。