使用其他列作为引用拆分列
本文关键字:引用 拆分 其他 | 更新日期: 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_Date和Tr_Data。在每个Tr_Date和Tr_Data中,有2个Tr_Time,我必须将其分为两列。这实际上是一个在timein/out系统中通过id扫描捕获的数据库。但是,输入和输出保存在一列中。我必须在SQL中进行分离。为了在工资单系统中操作用于计时的数据。
任何帮助都将不胜感激。
提前谢谢。
如果每个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演示(您的样本数据缺少任何输出行,所以我添加了一些带有随机数的额外行)
我不太了解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