使用其他列拆分列作为参考

时间:2013-07-08 08:47:38

标签: c# asp.net sql sql-server

我有一个表格,其中包含以下字段:

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_Date Tr_Data 。在每个 Tr_Date Tr_Data 中,有2个 Tr_Time ,我必须将其分成两个不同的列。这实际上是在timein / out系统中从id扫描捕获的数据库。但是,输入和输出保存在一列中。我必须在SQL中进行分离。为了操作薪资系统中的计时数据。

非常感谢任何帮助。

提前谢谢。

3 个答案:

答案 0 :(得分: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表(我不知道),也许你应该用正确的语法重新排列查询,但我认为这个概念可以帮助。

答案 1 :(得分:0)

如果每个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 DEMO (您的示例数据缺少任何行,因此我添加了一些带有随机数的额外行)

答案 2 :(得分:0)

试试这个

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