2016-01-25 18 views
0

,我得到一个返回以下员工数据的视图。如您所见,它显示3个相邻时隙(列FromTill)。在SQL Server上连接多个行的时间范围

----------------------------------------------------------------------------------------- 
| PerNr | Name  | From  | Till  | CostCentre | RowNumber | Percentage | 
----------------------------------------------------------------------------------------- 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-09 | Centre1 |   1 |  0.5 | 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-09 | Centre2 |   2 |  0.2 | 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-09 | Centre3 |   3 |  0.3 | 
| 12345678 | Marco Polo | 2015-12-10 | 2015-12-13 | Centre1 |   1 |  0.5 | 
| 12345678 | Marco Polo | 2015-12-10 | 2015-12-13 | Centre2 |   2 |  0.2 | 
| 12345678 | Marco Polo | 2015-12-10 | 2015-12-13 | Centre3 |   3 |  0.3 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre1 |   1 |  0.6 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre2 |   2 |  0.1 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre3 |   3 |  0.3 | 
----------------------------------------------------------------------------------------- 

现在我想结合数据(除PerNr,From和Till之外的所有内容)不会更改的块。结果应该如下所示(请注意,第一组和第二组的3行现在合并):

----------------------------------------------------------------------------------------- 
| PerNr | Name  | From  | Till  | CostCentre | RowNumber | Percentage | 
----------------------------------------------------------------------------------------- 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-13 | Centre1 |   1 |  0.5 | 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-13 | Centre2 |   2 |  0.2 | 
| 12345678 | Marco Polo | 2015-12-07 | 2015-12-13 | Centre3 |   3 |  0.3 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre1 |   1 |  0.6 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre2 |   2 |  0.1 | 
| 12345678 | Marco Polo | 2015-12-14 | 2015-12-16 | Centre3 |   3 |  0.3 | 
----------------------------------------------------------------------------------------- 

我试过到目前为止运行下面的语句:

SELECT result1.pernr, result1.name, result1.[from], result1.till, result1.costcentre, result1.rownumber, result1.percentage 
INTO #concatenated 
FROM #result result1 
INNER JOIN #result result2 ON 
    (result1.pernr = result2.pernr) AND 
    (
     (DATEADD(day, -1, result1.[from]) = t3.till OR 
     (DATEADD(day, -1, result1.[from]) = t2.till) 
    ) AND 
    result1.rn = result2.rn and 
    result1.costcentre = result2.costcentre and 
    result1.rownumber = result2.rownumber and 
    result1.percentage = result2.percentage 
; 

-- Join using GROUP BY 
SELECT t2.pernr, t2.name, min(t2.[from]) from, max(t2.till) till, t2.costcentre, t2.rownumber, t2.percentage 
FROM #concatenated t2 
GROUP BY t2.pernr, t2.name, t2.costcentre, t2.rownumber, t2.percentage; 

-- Find and add all not yet matched 
INSERT INTO #concatenated2 
SELECT t1.pernr, t1.name, t1.[from], t1.till, t1.costcentre, t1.rownumber, t1.percentage 
FROM #ergebnis t1 
WHERE 
    [from] not in (select [from] from #concatenated t2 where t1.pernr = t2.pernr) 
    and till not in (select till from #concatenated t2 where t1.pernr = t2.pernr); 

-- Show the result 
SELECT * FROM #concatenated2; 

这将返回结果,但不是预期的结果。第一条语句只返回RowNumber == 3的所有行。在第二条语句中,3行将被挤压在一起,而不会为每个块的第一行和第2行留出空间。

有没有一种方法来正确组合时间跨度? - 我正在使用SQL Server 2014标准版,所以像PIVOT和PARTITION这样的工具可以工作。

+1

你说的数据组合起来是什么意思?我在这里没有看到你的意思。此外,日期是否正常?2015-12-10至2015-12-09? –

+0

2015-12-07,08,09日期会怎样?为什么他们被排除在结果之外?在该日期之前,From = 2015-12-10与Till **的逻辑是什么? (2015年12月9日)。你确定结果代表“*合适的时间跨度*”吗?他们根本不适合我。 –

+0

在做群组时,避免错误的一个简单方法是按照规则遵循常规组:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用都必须标识分组列或作为设置功能“。即所选择的不是设置函数参数的列应该是group by子句中列出的列。 – jarlh

回答

0

试试这个:

SELECT PerNr, Name, MIN([FROM]) AS [FROM] ,MAX(Till) AS Till, CostCentre, RowNumber, Percentage 
FROM #result 
GROUP BY PerNr, Name, CostCentre,RowNumber,Percentage 
+0

我尝试了一个更大的结果集,它似乎工作。谢谢 – SSIS2013

+0

不客气:) –