2015-08-20 139 views
1

我有一个非常不寻常的请求。我在表中有一些过滤的数据,列是ID,日期和事件。 Event是一个XML列,其中一个标签是StartWork和EndWork。我从庞大的数据中筛选出了一个请求的数据。我的示例数据有6行,按照StartWork,EndWork,StartWork,EndWork等的顺序排列。 我想要做的是在每个组合之间找出时间差异。 我的意思是,EndWork - StartWork = Difference。 Next EndWork - StartWork = Difference2等等。将sql行转换为列

enter image description here

基本上我想,2-1,4-3,6-5等。 我试着用枢轴这样做,但不能得到期望的结果

回答

2
Select DateDiff(minute,StartWork.datacreated,EndWork.datacreated) 
from 
(Select datacreated,LineNb=row_number() over(Order by datacreated) from Table where eventdata.value('(/data/status/text())[1]','varchar(15)')='StartWork') StartWork 
INNER JOIN 
(Select datacreated,LineNb=row_number() over(Order by datacreated) from Table where eventdata.value('(/data/status/text())[1]','varchar(15)')='EndWork') EndWork 
ON StartWork.LineNb=EndWork.LineNb 
+0

谢谢hercule。这个解决方案工作 – anshul

1

这会帮助你:

declare @xmlStart XML='<data><status>StartWork</status></data>'; 
declare @xmlENd XML='<data><status>EndWork</status></data>'; 

declare @tbl TABLE(id INT,datecreated DATETIME,eventdata XML); 
INSERT INTO @tbl VALUES(1,{ts'2015-07-29 09:17:34'},@xmlStart) 
         ,(2,{ts'2015-07-29 09:20:24'},@xmlEnd) 
         ,(3,{ts'2015-07-29 10:05:41'},@xmlStart) 
         ,(4,{ts'2015-07-29 10:18:34'},@xmlEnd); 

WITH resolvedCTE AS 
(
    SELECT TOP 100 PERCENT id,datecreated,eventdata.value('(/data/status)[1]','varchar(max)') AS EventStatus FROM @tbl 
) 
,StartEvnets AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY datecreated) AS inx,id,datecreated FROM resolvedCTE WHERE EventStatus='StartWork' 
) 
,EndEvnets AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY datecreated) AS inx,id,datecreated FROM resolvedCTE WHERE EventStatus='EndWork' 
)SELECT StartEvnets.id, CAST(EndEvnets.datecreated - StartEvnets .datecreated AS TIME) 
FROM StartEvnets 
INNER JOIN EndEvnets ON StartEvnets.inx =EndEvnets.inx 
+0

SQL 2008不是2012年 – anshul

+0

好吧,我捣鼓出来的东西... – Shnugo

+0

由@hercule的解决方案是在相同的逻辑上,它只是更简单一些。它不使用CTE。 – anshul

0

假设“TBL”是你的表名。在这里你去:作为回答

SELECT t.datecreated - t2.datecreated 
FROM tbl t, tbl t2 
WHERE t.id IN 
    (SELECT id FROM tbl WHERE _eventdata LIKE ('%EndWork%')) 
    AND t2.id = t.id -1 

请标志,如果它的工作原理...