我有一个表格,其中包含以下字段:
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中进行分离。为了操作薪资系统中的计时数据。
非常感谢任何帮助。
提前谢谢。
答案 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_Date
,Tr_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