使用其他列作为引用拆分列

本文关键字:引用 拆分 其他 | 更新日期: 2023-09-27 18:21:32

我有一个表,下面显示了以下字段:

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,我必须将其分为两列。这实际上是一个在timein/out系统中通过id扫描捕获的数据库。但是,输入和输出保存在一列中。我必须在SQL中进行分离。为了在工资单系统中操作用于计时的数据。

任何帮助都将不胜感激。

提前谢谢。

使用其他列作为引用拆分列

如果每个Tr_DateTr_Data组合只有两行(IN第一,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演示(您的样本数据缺少任何输出行,所以我添加了一些带有随机数的额外行)

我不太了解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表(我不知道),也许你应该用正确的语法重新排列查询,但我认为这个概念会有所帮助。

尝试这个

SELECT  Tr_Date ,
        Tr_Data ,
        MAX(Tr_Time) ,
        MIN(Tr_Time)
FROM    TableName
GROUP BY Tr_Date ,
        Tr_Data