0

我有一个包含以下字段的表格:

Tr_Date   Tr_Time  Tr_Data
20130313    43359   41239
20130313    45317   46594
20130313    45920   62223
20130313    51227   51826
20130313    51312   51808
20130313    52131   47516
20130313    52443   61269
20130313    52447   63318
20130313    52453   2709
20130313    52545   61262
20130313    52623   21206
20130313    52655   48123
20130313    53250   29004
20130313    53440   55534
20130313    53503   30380
20130313    53932   46166
20130313    54157   2653
20130313    54325   46262
20130313    54503   2055
20130313    54548   18078
20130313    54557   21660
20130313    54623   54390
20130313    54656   46550
20130313    54700   59238

我需要做的是将Tr_Time分成两列。基础将是Tr_DateTr_Data。在每个Tr_DateTr_Data中,有 2 个Tr_Time我必须将它们分成两个不同的列。这实际上是从超时系统中的 id 扫描中捕获的数据库。但是,输入和输出保存在一列中。我必须在 SQL 中进行分离。为了在工资系统中操作数据以进行计时。

任何帮助将不胜感激。

先感谢您。

4

3 回答 3

0

如果每个组合只有两行Tr_DateTr_DataIN 第一,OUT 第二),您的查询可能如下所示:

WITH CTE AS 
(
  SELECT 
    *, ROW_NUMBER() OVER (PARTITION BY Tr_Date,Tr_Data ORDER BY Tr_Time) RN
  FROM Table1
)
SELECT
  c_in.Tr_Date
 ,c_in.Tr_Data
 ,c_in.Tr_Time AS Time_In
 ,c_out.Tr_Time AS Time_Out
FROM CTE c_in
LEFT JOIN CTE c_out 
  ON c_in.Tr_Date = c_out.Tr_Date 
  AND c_in.Tr_Data = c_out.Tr_Data
  AND c_in.RN = 1
  AND c_out.RN = 2
WHERE c_in.RN = 1

SQLFiddle DEMO (您的示例数据缺少任何输出行,因此我添加了一些带有随机数的额外行)

于 2013-07-08T09:13:54.147 回答
0

我不太了解 sql-server 语法,但我认为您应该使用GroupBy函数和MIN/MAX函数(或First, 取决于字段类型),如下所示:

INSERT INTO destTable SELECT 
    Tr_Date, 
    MIN(Tr_Time) as inField, 
    MAX(Tr_Time) as OutField, 
    Tr_Data 
FROM table 
GROUP BY  
    Tr_Date,
    Tr_Data;

如果字段不是整数,您可以使用以下内容:

INSERT INTO destTable SELECT 
    Tr_Date, 
    FIRST(Tr_Time) as inField, 
    FIRST(Tr_Time) as OutField, 
    Tr_Data 
FROM table 
GROUP BY  
    Tr_Date,
    Tr_Data;

在此之后,您应该像这样更新您的表格:

UPDATE destTable AS a 
    SET OutField = 
       (SELECT Tr_Time 
        FROM table as b 
        WHERE a.Tr_Date = b.Tr_Date 
             AND a.Tr_Data = bg.Tr_Data 
             AND b.Tr_Time <> a.OutField)

也许您应该destTable已经定义了表(我不知道),也许您应该使用正确的语法重新排列查询,但我认为这个概念会有所帮助。

于 2013-07-08T09:04:32.533 回答
0

尝试这个

SELECT  Tr_Date ,
        Tr_Data ,
        MAX(Tr_Time) ,
        MIN(Tr_Time)
FROM    TableName
GROUP BY Tr_Date ,
        Tr_Data
于 2013-07-08T10:15:13.740 回答